Skip to content

Instantly share code, notes, and snippets.

@1234ru
Last active August 3, 2024 15:04
Show Gist options
  • Save 1234ru/490e607c3edebae39f849539f07df84e to your computer and use it in GitHub Desktop.
Save 1234ru/490e607c3edebae39f849539f07df84e to your computer and use it in GitHub Desktop.

Загрузка сервера 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 # Сеть приходится слушать для работы JetBrains и MySQL Workbench
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 PRIVILEGES; (она требуется после запуска сервера с ключом --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

tmp 26.08.2023: если при попытке соединиться возникает ошибка ERROR 2061 (HY000): Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection., нужно добавить опцию --get-server-public-key. Подробнее см. https://bugs.mysql.com/bug.php?id=106852. Для каждой учетной записи потребуется однократный запуск mysql с такой опцией.

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

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(), убеждаемся, что запущена обновлённая версия сервера.

Загрузка данных часовых поясов

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

SELECT CONVERT_TZ(NOW(), @@time_zone, 'UTC'); # вернет NULL

Для Windows пригодных для этого системных файлов нет, поэтому нужно скачать SQL-файл (выбрать POSIX), и загрузить его на сервер под пользователем root:

mysql -u root -p mysql < timezone_2024a_posix_sql

После этого нужно перезапустить сервер MySQL.

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