До основного вмісту

Скидання пароля 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.

Чи була стаття корисною?
← Назад до бази знань Поставити питання підтримці