Сайт FSA
23.04.2018

Памятка по MySQL/MariaDB

Периодически возникает необходимость первоначальной настройки MySQL. Опишу несколько особенностей современной настройки.

В некоторых дистрибутивах, например, Debian 9, под mysql подразумевается mariadb, т.е. даже вы устанавливаете пакет mysql-server, то получаете mariadb-server.

Пароль root

Первая особенность - пользователь root недоступен при подключении через TCP. Он остаётся доступным только через unix-сокет. Поскольку подавляющее большинство использует TCP соединение в настройках PHP, соответственно все PHP-админки для MySQL не могут использовать пользователь root. Первое, что приходит в голову - разрешить root для TCP (и это можно сделать убрав в таблице mysql.user из поля plugin значение unix_socket). Однако, лучше не стрелять себе в ногу, а создать своего пользователя, который будет иметь полные привилегии для управления сервером. В таком случае, даже если кто-то получит доступ к вашей админке через интернет, то вынужден будет не только подбирать пароль для root, но ещё и угадывать пользователя. Если это не целевая атака на вашу систему, то у злоумышленника почти нет шансов это сделать.

Для предварительной настройки воспользуемся командной строкой:

mysql -u root -p

Изначально у пользователя root нет пароля и ключ -p можно не использовать, а если использовали, то принимается любой пароль.

Создаём нового пользователя mysuperuser с паролем 123 (я надеюсь вы понимаете, что пользователь и пароль приведёны для примера и в реальности нужно использовать своё оригинальное имя пользователя и сложный пароль):

CREATE USER mysuperuser@localhost IDENTIFIED BY '123';

Теперь мы можем подключиться к нашему серверу баз данных. Однако, мы имеем ограниченные права.

GRANT ALL PRIVILEGES ON *.* TO mysuperuser@localhost WITH GRANT OPTION;

Т.е. задаём все права (ALL) для всех ресурсов (.) для нашего пользователя. WITH GRANT OPTION означает, что будут предоставлены дополнительные права на изменение структуры баз и таблиц.

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

FLUSH PRIVILEGES;

Судя по всему, делать этого не обязательно, т.к. работа с пользователями производилась с помощью команд CREATE и GRANT, а не при помощи INSERT/UPDATE в базе mysql.

Логика подсказывает, что изменить пользователя, в том числе пароль, можно с помощью команды:

ALTER USER mysuperuser@localhost IDENTIFIED BY 'new_password';

Но что-то пошло не так. Как оказывается, эта команда была введена в MySQL-5.7.6 и MariaDB-10.2. Если вы используете более старую версию (а на момент написания этой заметки в Debian доступна из основного репозитория только MariaDB 10.1), то изменить пароль можно следующим образом:

SET PASSWORD FOR mysuperuser@localhost = PASSWORD('new_password');

Кодировка

Как известно, в мире unix уже давно в качестве стандартной кодировки используется UTF-8 (привет пользователям Windows!!!). В MySQL поддержка UTF-8 имеется в нескольких наборах. Далее я буду иметь под словом “кодировка” как непосредственно кодировку, так и правила сортировки collation.

До недавнего времени я использовал кодировку utf8_general_ci, но, как оказалось, я немного отстал от жизни. Эта кодировка появилась первой. Позже была создана ещё одна utf8mb4. Она появилась ещё в версии MySQL 5.5.3. От первой она отличается увеличенным до 4 байт объёмом хранения одного символа. Лично я, поскольку использую русские символы, никогда не сталкивался с какими-то проблемами с utf8. Но, дабы избежать потенциальных проблем, лучше использовать utf8mb4.

Для utf8mb4 существует два основных варианта utf8mb4_general_ci и utf8mb4_unicode_ci. Судя по статьям в интернете, utf8mb4_general_ci является упрощённой и имеющая оптимизации при сортировке. Однако эти оптимизации могут вызвать в некоторых случаях не тот результат, что вы ожидаете. Поэтому лучше использовать кодировку utf8mb4_unicode_ci. К тому же, по некоторым данным, на современном железе разница в скорости сортировки практически незаметна (я думаю. если вы соберётесь создавать высоконагруженное приложение, то проведёте соответствующие тесты и выберете подходящий вариант). И ещё, немаловажно, по заявлению Oracle в MySQL 8.0, которая вышла в след за 5.7 (была изменена нумерация релизов), проведена значительная оптимизация скорости сортировки для utf8mb4, что позволяет получить 20 кратный прирост производительности.

Ну а что современные дистрибутивы? MySQL по умолчанию поставляется Oracle с кодировкой latin1. Переход на utf0mb4 произведён только в версии 8.0. В текущей версии MariaDB из репозитория Debian изначально используется utf8mb_general_ci.

База часовых поясов

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

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql -p

Операцию можно повторить, т.к. сгенерированный командой mysql_tzinfo_to_sql скрипт имеет в своём составе команды на удаление существующих таблиц. После обновления базы часовых поясов необходимо перезапустить MySQL-сервер.

База часовых поясов позволит вам устанавливать необходимый часовой пояс и учитывать все изменения для текущей местности при работе с датами из прошлого:

SET TIME_ZONE="Asia/Yekaterinburg"

Обратите внимание, что заметки могут обновляться со временем. Это может быть как исправление найденных ошибок, так и доработка содержания с целью более полного раскрытия темы. Информация об изменениях доступна в репозитории на github. Там же вы можете оставить в Issue ваши замечания по данной заметке.


Если данная заметка оказалась вам полезной, можете поблагодарить автора финансово.