Skip to content

Instantly share code, notes, and snippets.

@1234ru

1234ru/mysql-win.md

Last active Oct 29, 2020
Embed
What would you like to do?

Загрузка сервера MySQL и подготовка к запуску

  1. Скачиваем Community Server в виде zip-архива.
    (Если пугают новшества последних версий, можно остановиться на 5.7. Например, 5.7.26-winx64.)
    На странице загрузки можно перейти по ссылке No thanks, just start my download в нижней части страницы.

  2. Распаковываем куда-нибудь.

  3. Удаляем папку lib (она содержит исходный код для самостоятельной компиляции и при работе сервера не требуется). Также можно удалить файлы bin/*.pdb (они нужны только для отладки исполняемых файлов MySQL и при обычной работе не требуются). Это позволит снизить общий размер инсталляции примерно в 4 раза, он станет порядка 200 Мб.

  4. Добавляем в системную переменную PATH путь {каталог MySQL}\bin, чтобы было удобней запускать exe-файлы.

Выбор места для хранения данных и конфигурационный файл my.ini

Нужно выбрать каталог, где MySQL будет хранить файлы баз данных и некоторые служебные файлы. Рекомендуется это сделать вне каталога сервера MySQL, т.к. файлы БД следует рассматривать независимо от конкретной инсталляции/версии.

Затем нужно создать файл my.ini, поместив его в корневой каталог сервера MySQL (т.е. рядом с bin и пр.; my.ini в корневом каталоге запуска сервер будет пытаться найти и прочитать автоматически). Содержимое файла должно быть следующим:

[mysqld]
datadir = 'D:/s/.mysql-datadir'
character_set_server = utf8
sql_mode =
skip-networking = 1
named-pipe = 1
local_infile = 1 # С версии 8.0
skip_log_bin = 1 # С версии 8.0 против долгого waiting for handler commit при вставках
# log-syslog = 0 # До версии 5.7 включительно

[client]
# mysql, mysqldump, mysqladmin
user = someone
password = "a password"
pipe
loose-local-infile = 1 # С версии 8.0 для LOAD DATA LOCAL INFILE

[mysqldump]
# С версии 8.0
# https://dba.stackexchange.com/a/273040
no-tablespaces = 1 # чтобы не нужна была привилегия PROCESS
single-transaction = 1 # чтобы не нужна была привилегия LOCK TABLES

Указание datadir является обязательным. Без этого сервер не запустится. Обратный слэш (\), стандартно используемый в путях Windows, интерпретируется как экранирующий и образующий управляющие последовательности (\n, \s и др.) символ, поэтому его самого нужно экранировать или же использовать вместо него прямой слэш:

datadir = "D:\\somedir\\data"
datadir = "D:/somedir/data"

Как правило, данные требуют хранения в кодировке UTF-8. Настройка character_set_server позволяет избежать явного указания кодировки при каждом случае создания базы данных или таблицы.

Если при запуске сервера возникают сообщения об ошибках насчет невомзожности записи в системный журнал событий Windows, можно добавить в my.ini запись log-syslog = 0.

Все настройки сервера перечислены здесь и здесь.

Первый запуск mysqld - инициализация каталога данных

С версии 5.7 нужно проводить первичную инициализацию каталога данных, для чего при первом запуске служит специальный ключ:

mysqld --initialize

Может возникнуть сообщение от брандмауэра Windows, которому нужно указать соотв. разрешения.

Инициализировав каталог данных, сервер завершит работу и вернёт управление командной строке.

В каталоге данных среди прочих будет файл с расширением .err, где можно посмотреть журнал сервера и поискать сообщения об ошибках, если что-то пошло не так.

Второй запуск mysqld - установка пароля пользвателю root

При первом запуске сервера для рута был сгенерирован временный пароль (действительный только на одну сессию) и записан в err-файл. Вместо того, чтобы искать его там, удобнее лишний раз запустить сервер в режиме без проверки прав:

mysqld --skip-grant-tables

Этот режим позволит залогиниться под рутом без указания пароля, после чего по специальной процедуре установить желаемый пароль. Нужно выполнить следующие шаги:

  1. Из командной строки запускаем консольный клиент mysql.

  2. Даем команду FLUSH PRIVILLEGES; (она требуется после запуска сервера с ключом --skip-grant-tables, чтобы начали работать команды по управлению учетными записями).

  3. Устанавливаем пароль:

    • MySQL 5.7.6 и выше: ALTER USER 'root'@'localhost' IDENTIFIED BY 'somepass';

    • 5.7.5 и ранее: SET PASSWORD FOR 'root'@'localhost' = PASSWORD('somepass');

  4. Останавливаем сервер с помощью команды SHUTDOWN.
    Сервер завершит работу и вернёт управление командной строке, из клиента нужно выйти вручную (продолжать сессию смысла нет, т.к. соединение разорвано и автоматически возобновлено не будет).
    Остановка сервера необходима, чтобы прекратить работу в режиме отсутствия проверки прав доступа.

    Для MySQL 5.7.8 и ранее следует использовать утилиту mysqladmin, дав из терминала команду mysqladmin -u root -p shutdown (потребуется ввести пароль рута).

Создание учетных записей, загрузка данных и дальнейшая работа

Теперь нужно создать учетные записи обычных пользователей и базы данных для них.

Для этого снова запускаем mysqld, уже без каких-либо дополнительных ключей, после чего соединяемся с ним с помощью клиента mysql от имени пользователя root. Теперь потребуется указать пароль:

mysql -u root -p

Далее создаем учетные записи пользователей и базы данных. Как правило, каждому пользователю выделяется своя база данных, к которой он получает полный доступ. Набор команд при этом следующий:

CREATE USER someone@localhost IDENTIFIED BY 'a password';

CREATE DATABASE somedb;

GRANT ALL ON somedb.* TO someone@localhost;

Упрощенный вариант: один пользователь (не root) с доступом ко всем базам - более подходящий вариант для локальной машины, за которой работает один человек и разделение прав доступа ни к чему. В таком случае первая команда выполняется только один раз.

Работа через named pipe

Сервер MySQL на компьютере разработчика обычно принимает соединения только с этого же компьютера. Такие соединения можно принимать через named pipe, а сетевой интерфейс сервера MySQL вообще закрыть за ненадобностью и по соображениям безопасности.

За включение named pipe и отключение сети отвечают две разных настройки (причем второе без первого не сработает). Запуск сервера с ними выглядит следующим образом:

mysqld --named-pipe --skip-networking

Или указать эти же опции в my.ini, чтобы запускать сервер без аргументов:

[mysqld]
...
named-pipe 
skip-networking

В каталоге данных появится файл .pid.

Как PHP под Windows, так и различные GUI для работы с базами данных (например, MySQL Workbench, однако не(!) JetBrains DataGrip) умеют устанавливать соединение через named pipe.

Утилитам командной строки (mysql, mysqladmin и пр.) нужно указывать опцию --pipe.

Настройки для клиента ([client])

В конфигурационном файле также можно указать настройки для клиентских программ (например, чтобы не вводить каждый раз пароль и пр.).

В отличие от Linux, конфигурационный файл из домашнего каталога пользователя не читается. Список мест, откуда файлы будут прочитаны, можно посмотреть командой mysql --help (где-то в середине вывода будет фраза Default options are read from the following files in the given order). Можно указыать клиентские настройки в том же файле, что и настройки сервера:

[mysqld]
...

[client]
user = someone
password = "a password"
pipe

Обновление сервера MySQL

  1. Повторяем пункты 1-3 из раздела Загрузка и подготовка к запуску. Пакет можно разместить в каталоге рядом с имеющимся, чтобы на всякий случай было две версии одновременно.

  2. Открываем командную строку и останавливаем текущую версию сервера: mysqld stop или mysqladmin -u root -pпароль shutdown

  3. Заменяем путь в переменной PATH.

  4. Копируем файл my.ini из старого каталога в новый.

  5. Даём команду на запуск, не забыв необходимые ключи. Например, mysqld --skip-networking --named-pipe. Первый запуск может проходить долго.

  6. Если возникает ошибка про файл с названием вида VCRUNTIME*.dll - значит, нужно обновить версию Microsoft Visual Studio. Скачиваем файл vc_redist.x64.exe с официального сайта Microsoft и запускаем его. После этого повторяем предыдущий пункт, всё должно пройти нормально.

  7. Если сервер все-таки не запускается (завершает работу и отдает управление в командной строке), нужно найти в файл с расширением *.err в каталоге для хранения данных и посмотреть, что там написано.
    Один из вариантов решения проблемы - сначала запустить сервер с ключом --initialize, и после того, как он завершит работу, запустить его снова уже в штатном режиме.
    *Замечено, что при обновлении с версии 5.7 при запуске над теми же данными (без перезаливки) сервер требует запуска два-три раза подряд, и только последний из них проходит успешно.

  8. Выполняем запрос SELECT VERSION(), убеждаемся, что запущена обновлённая версия сервера.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment