Сброс пароля 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Метод 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;Ошибки после сброса пароля
| Ошибка | Причина | Решение |
|---|---|---|
| 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.