-
Скачиваем Community Server в виде zip-архива.
(Если пугают новшества последних версий, можно остановиться на 5.7. Например, 5.7.26-winx64.)
На странице загрузки можно перейти по ссылке No thanks, just start my download в нижней части страницы. -
Распаковываем куда-нибудь.
-
Удаляем папку
lib
(она содержит исходный код для самостоятельной компиляции и при работе сервера не требуется). Также можно удалить файлыbin/*.pdb
(они нужны только для отладки исполняемых файлов MySQL и при обычной работе не требуются). Это позволит снизить общий размер инсталляции примерно в 4 раза, он станет порядка 200 Мб. -
Добавляем в системную переменную
PATH
путь{каталог MySQL}\bin
, чтобы было удобней запускать exe-файлы.
Нужно выбрать каталог, где 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
.
Все настройки сервера перечислены здесь и здесь.
С версии 5.7 нужно проводить первичную инициализацию каталога данных, для чего при первом запуске служит специальный ключ:
mysqld --initialize
Может возникнуть сообщение от брандмауэра Windows, которому нужно указать соотв. разрешения.
Инициализировав каталог данных, сервер завершит работу и вернёт управление командной строке.
В каталоге данных среди прочих будет файл с расширением .err
, где можно посмотреть журнал сервера и поискать сообщения об ошибках, если что-то пошло не так.
При первом запуске сервера для рута был сгенерирован временный пароль (действительный только на одну сессию) и записан в err-файл. Вместо того, чтобы искать его там, удобнее лишний раз запустить сервер в режиме без проверки прав:
mysqld --skip-grant-tables
Этот режим позволит залогиниться под рутом без указания пароля, после чего по специальной процедуре установить желаемый пароль. Нужно выполнить следующие шаги:
-
Из командной строки запускаем консольный клиент
mysql
. -
Даем команду
FLUSH PRIVILEGES;
(она требуется после запуска сервера с ключом--skip-grant-tables
, чтобы начали работать команды по управлению учетными записями). -
Устанавливаем пароль:
-
MySQL 5.7.6 и выше:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'somepass';
-
5.7.5 и ранее:
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('somepass');
-
-
Останавливаем сервер с помощью команды
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) с доступом ко всем базам - более подходящий вариант для локальной машины, за которой работает один человек и разделение прав доступа ни к чему. В таком случае первая команда выполняется только один раз.
Сервер 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
.
В конфигурационном файле также можно указать настройки для клиентских программ (например, чтобы не вводить каждый раз пароль и пр.).
В отличие от Linux, конфигурационный файл из домашнего каталога пользователя не читается. Список мест, откуда файлы будут прочитаны, можно посмотреть командой mysql --help
(где-то в середине вывода будет фраза Default options are read from the following files in the given order).
Можно указыать клиентские настройки в том же файле, что и настройки сервера:
[mysqld]
...
[client]
user = someone
password = "a password"
pipe
-
Повторяем пункты 1-3 из раздела Загрузка и подготовка к запуску. Пакет можно разместить в каталоге рядом с имеющимся, чтобы на всякий случай было две версии одновременно.
-
Открываем командную строку и останавливаем текущую версию сервера:
mysqld stop
илиmysqladmin -u root -pпароль shutdown
-
Заменяем путь в переменной
PATH
. -
Копируем файл
my.ini
из старого каталога в новый. -
Даём команду на запуск, не забыв необходимые ключи. Например,
mysqld --skip-networking --named-pipe
. Первый запуск может проходить долго. -
Если возникает ошибка про файл с названием вида
VCRUNTIME*.dll
- значит, нужно обновить версию Microsoft Visual Studio. Скачиваем файлvc_redist.x64.exe
с официального сайта Microsoft и запускаем его. После этого повторяем предыдущий пункт, всё должно пройти нормально. -
Если сервер все-таки не запускается (завершает работу и отдает управление в командной строке), нужно найти в файл с расширением
*.err
в каталоге для хранения данных и посмотреть, что там написано.
Один из вариантов решения проблемы - сначала запустить сервер с ключом--initialize
, и после того, как он завершит работу, запустить его снова уже в штатном режиме.
*Замечено, что при обновлении с версии 5.7 при запуске над теми же данными (без перезаливки) сервер требует запуска два-три раза подряд, и только последний из них проходит успешно. -
Выполняем запрос
SELECT VERSION()
, убеждаемся, что запущена обновлённая версия сервера.