К основному содержимому

Сброс пароля root в MySQL и MariaDB: пошаговое руководство

MySQL / MariaDB · 19.04.2026 · 4 мин чтения
Иллюстрация к статье «Сброс пароля root в MySQL и MariaDB: пошаговое руководство»

Сброс пароля root в MySQL 8.0 / MariaDB 10.4+

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

Метод 1: --skip-grant-tables (универсальный)

# 1. Остановить MySQL
sudo systemctl stop mysql
# или
sudo systemctl stop mariadb

# 2. Запустить без проверки привилегий
sudo mysqld_safe --skip-grant-tables --skip-networking &

# 3. Подключиться без пароля
mysql -u root

# 4. Сбросить пароль
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword123!';

# Для MariaDB < 10.4:
UPDATE mysql.user SET authentication_string=PASSWORD('NewPassword123!') WHERE User='root';
FLUSH PRIVILEGES;

# 5. Выйти и перезапустить
EXIT;
sudo killall mysqld_safe mysqld
sudo systemctl start mysql

Метод 2: init-file (MySQL 8.0 рекомендуется)

# 1. Создать файл с SQL-командой
cat > /tmp/mysql-reset.sql << 'EOF'
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword123!';
EOF

# 2. Остановить MySQL
sudo systemctl stop mysql

# 3. Запустить с init-file
sudo mysqld --init-file=/tmp/mysql-reset.sql --user=mysql &

# 4. Подождать запуска и убить
sleep 5 && sudo killall mysqld

# 5. Удалить файл и перезапустить
rm /tmp/mysql-reset.sql
sudo systemctl start mysql
mysql -u root -p
Для MySQL 8.0 используйте метод с init-file — он безопаснее и не отключает сетевое подключение.

Метод 3: через операционную систему (Ubuntu/Debian)

# На Ubuntu MySQL может использовать unix_socket аутентификацию
sudo mysql
# Если это работает без пароля — можно сменить пароль:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'NewPass!';
FLUSH PRIVILEGES;

Смена пароля для обычного пользователя

# Зная текущий пароль root:
mysqladmin -u root -pCurrentPassword password NewPassword123!

# Через SQL:
ALTER USER 'username'@'localhost' IDENTIFIED BY 'NewPassword123!';
FLUSH PRIVILEGES;
После сброса пароля обязательно: обновите пароль в конфигурационных файлах приложений (.env, wp-config.php, config.php и т.д.), иначе сайт перестанет работать.

Ошибки после сброса пароля

ОшибкаПричинаРешение
ERROR 1045 (28000): Access denied for user 'root'@'localhost'Новый пароль не совпадает с тем, что записан в конфиге приложения, либо сброс не завершился (сервер не перезапущен)Проверить пароль в .env/config.php, перезапустить mysqld штатно после сброса
ERROR 1698 (28000): Access denied for user 'root'@'localhost'На Ubuntu root привязан к плагину unix_socket, а не к паролю — ALTER USER с паролем не применяется без указания плагинаИспользовать ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'pass';
ERROR 2002 (HY000): Can't connect to local MySQL server through socketСервер не запущен после аварийного восстановления или сокет по нестандартному путиПроверить systemctl status mysql и путь socket в my.cnf

Почему сброс пароля root — это угроза безопасности, если оставить сервер открытым

Режим --skip-grant-tables отключает проверку прав вообще для всех пользователей, не только для root — пока сервер работает в этом режиме, любой, кто может подключиться к сокету или порту 3306, получает полный доступ без пароля. Флаг --skip-networking в примере команды обязателен: он не даёт открыть 3306 порт наружу на время сброса. Если сервер доступен из интернета и сброс делается без --skip-networking, окно между запуском и сменой пароля — это время, когда базу может захватить кто угодно, кто знает, что порт открыт.

Когда простой сброс пароля не решит проблему

Если доступ к серверу потерян не только для root, но и для SSH или консоли провайдера, ни один из трёх методов не применить — они требуют локального доступа к файловой системе или возможности перезапустить процесс mysqld от имени привилегированного пользователя ОС. В managed-базах данных облачных провайдеров (RDS, Cloud SQL) прямого доступа к файлам обычно нет — пароль root сбрасывается через панель управления провайдера, а не через mysqld_safe.

Проверка, что доступ восстановлен полностью

# Подключение новым паролем
mysql -u root -p -e "SELECT CURRENT_USER(), VERSION();"

# Убедиться, что не осталось пользователей без пароля
mysql -u root -p -e "
SELECT User, Host, authentication_string
FROM mysql.user
WHERE authentication_string = '' OR authentication_string IS NULL;"

# Проверить, что сеть снова слушает как обычно (если использовался --skip-networking)
SHOW VARIABLES LIKE 'skip_networking';
netstat -tlnp | grep 3306

Пустой результат из второго запроса означает, что других пользователей с пустым паролем не осталось — это стоит проверить сразу после восстановления, потому что режим --skip-grant-tables иногда используют и для быстрого доступа «на всякий случай», забывая закрыть его потом. Права конкретных пользователей после восстановления описаны в статье про управление пользователями MySQL.

Статья помогла?
← Назад в базу знаний Задать вопрос поддержке