Почему MySQL/MariaDB в Linux не пускает под root

В современных дистрибутивах Linux (таких как Gentoo, Ubuntu, Debian и др.) MySQL и MariaDB по умолчанию используют плагин аутентификации auth_socket (или unix_socket).

Этот плагин привязывает авторизацию в базе данных к вашей текущей сессии в операционной системе. Он проверяет, совпадает ли имя системного пользователя Linux с именем пользователя, под которым вы пытаетесь войти в СУБД.

Из-за этого логика работы выглядит следующим образом:

  • Если вы в терминале Linux авторизованы как обычный пользователь (например, user), то при выполнении mysql -u root -p система безопасности MySQL видит, что запрос идет от имени user, а не root, и блокирует подключение, даже если вы вводите правильный пароль.
  • Если вы введете sudo mysql (вызов от имени системного root), плагин успешно сопоставит имена, и вас впустит без ввода пароля базы данных.

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

Как разрешить вход по паролю для root в MySQL

Если вы хотите подключаться к MySQL под учетной записью root из-под любого пользователя Linux, используя обычный пароль, вам необходимо изменить плагин аутентификации на стандартный.

Войдите в MySQL из под root:

gentoo ~ # mysql

Смените плагин аутентификации и установите свой пароль, выполнив команду в консоли MySQL:

ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'ваш_надежный_пароль';
FLUSH PRIVILEGES;

Выйдите из СУБД (exit). Теперь вы сможете подключаться из-под обычного пользователя Linux по классической схеме:

gentoo ~ # mysql -u root -p

Как разрешить вход по паролю для root в MariaDB

В MariaDB логика работает точно так же, но используется плагин под названием unix_socket.

Если у вас установлена именно MariaDB, команда для переключения на классический вход по паролю будет немного отличаться от MySQL.

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

gentoo ~ # mariadb

или sudo mysql, если эта команда привычнее — в MariaDB они взаимозаменяемы.

Выполните команду, которая отключит плагин unix_socket и установит обычный пароль:

ALTER USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING PASSWORD('ваш_новый_пароль');
FLUSH PRIVILEGES;

Выйдите из консоли MariaDB (exit). Теперь вы сможете подключаться из-под любого пользователя Linux стандартной командой:

gentoo ~ # mariadb -u root -p