MySQL: Как изменить или сбросить пароль root в MySQL и MariaDB

Инструкция помогает изменить известный пароль или восстановить доступ к учётной записи root@localhost в MySQL и MariaDB на Linux с systemd.

Сначала определите, что установлено на сервере. Команды для MySQL и MariaDB похожи, но устройство системных пользователей и способы аутентификации различаются.

Когда инструкция не подходит: для управляемых облачных баз данных, кластеров Galera, Docker-контейнеров и серверов без доступа к операционной системе используйте штатную процедуру провайдера или конкретного образа.

Перед началом

Проверьте версию клиента и название системной службы:

mysql --version

sudo systemctl status mysqld --no-pager
sudo systemctl status mariadb --no-pager

Обычно используются следующие имена:

  • mysqld — Oracle MySQL из RPM-репозитория на AlmaLinux, Rocky Linux и RHEL;
  • mariadb — MariaDB;
  • mysql — MySQL на Debian и Ubuntu.

В командах ниже замените CHANGE_ME_Strong_2026! собственным длинным уникальным паролем. Не вставляйте реальный пароль непосредственно в параметры командной строки.

Если текущий пароль известен

MySQL 8.0 и 8.4

Подключитесь к серверу. Ключ -p без значения запросит пароль безопаснее, чем передача его прямо в команде:

mysql -u root -p

Проверьте фактическую учётную запись и способ аутентификации:

SELECT VERSION(), CURRENT_USER();

SELECT User, Host, plugin
FROM mysql.user
WHERE User = 'root';

Если используется root@localhost, измените пароль:

ALTER USER 'root'@'localhost'
	IDENTIFIED BY 'CHANGE_ME_Strong_2026!';

Команда применяется сразу. После обычного ALTER USER выполнять FLUSH PRIVILEGES не требуется.

MariaDB с парольной аутентификацией

mariadb -u root -p
SELECT VERSION(), CURRENT_USER();

SHOW CREATE USER 'root'@'localhost'\G

ALTER USER 'root'@'localhost'
	IDENTIFIED BY 'CHANGE_ME_Strong_2026!';

MariaDB 10.4+: сначала проверьте unix_socket

В MariaDB 10.4 и новее локальная учётная запись root@localhost часто использует плагин unix_socket. В таком случае пароль не потерян: MariaDB проверяет системного пользователя Linux.

Попробуйте войти через локальный Unix-сокет:

sudo mariadb --protocol=socket

Проверьте конфигурацию пользователя:

SHOW CREATE USER 'root'@'localhost'\G

Если вход через sudo mariadb работает, безопаснее сохранить unix_socket и не использовать root в приложениях.

Когда дополнительно нужен вход root по паролю, можно сохранить оба способа аутентификации:

ALTER USER 'root'@'localhost'
	IDENTIFIED VIA unix_socket
	OR mysql_native_password
	USING PASSWORD('CHANGE_ME_Strong_2026!');

PASSWORD() в этом примере относится только к MariaDB. В MySQL 8 эта функция для управления паролями не используется.

Сброс забытого пароля в MySQL 8 через init-file

Для MySQL 8 предпочтителен временный файл, который выполняется сервером при запуске. Пароль не передаётся в аргументах процесса, однако сам файл необходимо защитить и сразу удалить.

1. Создайте защищённый SQL-файл

sudo install 	-o mysql 	-g mysql 	-m 600 	/dev/null 	/var/lib/mysql/mysql-init.sql

sudo vi /var/lib/mysql/mysql-init.sql

Поместите в файл одну команду:

ALTER USER 'root'@'localhost'
	IDENTIFIED BY 'CHANGE_ME_Strong_2026!';

На AlmaLinux, Rocky Linux и RHEL восстановите SELinux-контекст:

sudo restorecon -v /var/lib/mysql/mysql-init.sql

2. Перезапустите MySQL с параметром init-file

sudo systemctl stop mysqld

sudo systemctl set-environment 	MYSQLD_OPTS="--init-file=/var/lib/mysql/mysql-init.sql"

sudo systemctl start mysqld
sudo systemctl status mysqld --no-pager

3. Немедленно удалите файл и временный параметр

sudo systemctl unset-environment MYSQLD_OPTS
sudo rm -f /var/lib/mysql/mysql-init.sql
sudo systemctl restart mysqld

Если служба не запустилась или пароль не изменился, проверьте журнал:

sudo journalctl -u mysqld -n 100 --no-pager

Альтернативный сброс MySQL через skip-grant-tables

Этот способ менее безопасен: сервер временно запускается без проверки привилегий. Используйте его только через локальную консоль и обязательно отключайте сетевые подключения.

1. Запустите MySQL без таблиц привилегий

sudo systemctl stop mysqld

sudo systemctl set-environment 	MYSQLD_OPTS="--skip-grant-tables --skip-networking"

sudo systemctl start mysqld

2. Измените пароль

mysql -u root
FLUSH PRIVILEGES;

ALTER USER 'root'@'localhost'
	IDENTIFIED BY 'CHANGE_ME_Strong_2026!';

EXIT;

Здесь FLUSH PRIVILEGES выполняется до ALTER USER: сервер должен снова загрузить таблицы привилегий, чтобы разрешить команды управления пользователями.

3. Верните обычный режим

sudo systemctl unset-environment MYSQLD_OPTS
sudo systemctl restart mysqld

Сброс доступа в MariaDB 10.4+

Сначала всегда пробуйте:

sudo mariadb --protocol=socket

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

1. Создайте временную конфигурацию

Для AlmaLinux, Rocky Linux и RHEL обычно используется каталог /etc/my.cnf.d/:

sudo install 	-o root 	-g root 	-m 600 	/dev/null 	/etc/my.cnf.d/zz-reset-root.cnf

sudo vi /etc/my.cnf.d/zz-reset-root.cnf

Содержимое файла:

[mariadbd]
skip-grant-tables
skip-networking

2. Запустите MariaDB и восстановите учётную запись

sudo systemctl stop mariadb
sudo systemctl start mariadb

mariadb -u root
FLUSH PRIVILEGES;

ALTER USER 'root'@'localhost'
	IDENTIFIED VIA unix_socket
	OR mysql_native_password
	USING PASSWORD('CHANGE_ME_Strong_2026!');

EXIT;

3. Удалите временную конфигурацию

sudo rm -f /etc/my.cnf.d/zz-reset-root.cnf
sudo systemctl restart mariadb

На Debian и Ubuntu конфигурационный каталог обычно отличается. Проверьте подключаемые файлы командой:

mariadbd --help --verbose 2>/dev/null 	| grep -A 1 "Default options"

Проверка результата

MySQL

sudo systemctl is-active mysqld

mysql -u root -p 	-e "SELECT VERSION(), CURRENT_USER();"

MariaDB через пароль

sudo systemctl is-active mariadb

mariadb -u root -p 	-e "SELECT VERSION(), CURRENT_USER();"

MariaDB через unix_socket

sudo mariadb --protocol=socket 	-e "SELECT VERSION(), CURRENT_USER();"

Дополнительно убедитесь, что сервер снова принимает подключения в обычном режиме:

mysqladmin -u root -p ping

Частые ошибки

ERROR 1396: Operation ALTER USER failed

Вероятно, учётная запись root имеет другой компонент Host. Найдите точное имя:

SELECT User, Host, plugin
FROM mysql.user
WHERE User = 'root';

После этого подставьте найденный Host вместо localhost.

ERROR 1819: Your password does not satisfy the current policy

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

Access denied после успешной смены пароля

  • проверьте, что подключаетесь к правильной учётной записи и через правильный Host;
  • проверьте плагин аутентификации;
  • в MariaDB попробуйте локальное подключение через sudo mariadb --protocol=socket;
  • не используйте принудительно mysql_native_password в MySQL 8.4: этот плагин отключён по умолчанию;
  • проверьте журнал службы через journalctl.

Безопасность

  • Не передавайте пароль в виде mysql -pПароль: он может попасть в историю оболочки или список процессов.
  • При использовании skip-grant-tables обязательно добавляйте skip-networking.
  • Удаляйте временный SQL-файл или конфигурацию сразу после восстановления доступа.
  • Не редактируйте напрямую mysql.user и mysql.global_priv.
  • Не используйте root в PHP-приложениях, CMS и фоновых заданиях.
  • Создайте отдельного администратора и отдельных пользователей приложений с минимально необходимыми правами.
  • Перед операцией на важном сервере сделайте снимок VPS или резервную копию.

Почему старый способ больше не подходит

В старых инструкциях часто встречается такой запрос:

UPDATE mysql.user
SET authentication_string = PASSWORD('new_password')
WHERE User = 'root';

Так делать не следует:

  • в MySQL 8 функция PASSWORD() не используется для управления паролями;
  • структура системных таблиц различается между версиями MySQL и MariaDB;
  • в MariaDB 10.4+ данные учётных записей хранятся в mysql.global_priv, а mysql.user используется как представление;
  • прямое изменение системных таблиц обходит проверки и логику плагинов аутентификации;
  • поддерживаемый способ — ALTER USER или SET PASSWORD для подходящей версии.

Производительность

Смена пароля почти не влияет на производительность. Основной риск — простой базы во время остановки и повторного запуска службы. Выполняйте восстановление в окно обслуживания и заранее проверьте доступ к консоли сервера.

Совместимость

  • MySQL 8.0 и 8.4 на Linux с systemd;
  • MariaDB 10.4–10.11 и MariaDB 11.x;
  • AlmaLinux, Rocky Linux и RHEL;
  • для Debian и Ubuntu измените имя службы и путь к каталогу конфигурации.

Альтернативы

  • Для MariaDB оставить root только с unix_socket и входить через sudo mariadb.
  • Создать отдельного административного пользователя вместо парольного входа root.
  • Для облачной базы сбросить пароль через панель или API провайдера.
  • Для Docker использовать процедуру конкретного образа и не рассчитывать, что изменение переменной окружения сбросит пароль уже созданной базы.

Документация

up: Просмотров: 957
Материал помог? Оценка помогает находить устаревшие и спорные решения.

Комментарии

0

Нашли ошибку или хотите дополнить материал?

Комментариев пока нет.Можно первым дополнить материал или сообщить об ошибке.
Telegram