Инструкция помогает изменить известный пароль или восстановить доступ к учётной записи 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 использовать процедуру конкретного образа и не рассчитывать, что изменение переменной окружения сбросит пароль уже созданной базы.
Комментарии
0Нашли ошибку или хотите дополнить материал?