Root 密碼遺忘是 MySQL 運維最高頻應急場景。本文提供 Linux/Windows 通用的標準化重置流程:跳過權限表啟動 → 無密登入更新密碼 → 恢復配置重啟驗證,並針對 5.7/8.0 語法差異、mysqld_safe 守護進程陷阱、Windows 服務模式給出專項指引。
MySQL 權限驗證發生在連接階段。啟動參數 --skip-grant-tables 使服務器跳過授權表載入,任何用戶無密碼即可連接並擁有所有權限。此時更新 mysql.user 表的 authentication_string (5.7) 或 Password (8.0) 列,重啟正常模式即生效。
# Systemd
systemctl stop mysqld
# 若使用 mysqld_safe 守護進程,需先殺守護進程再殺 mysqld
pkill -f mysqld_safe
pkill -f mysqld
# 或
kill -TERM $(cat /var/run/mysqld/mysqld.pid) # 優雅關閉
# 切勿 kill -9 除非極端卡死,否則數據可能不一致
mysqld_safe --skip-grant-tables --skip-networking --user=mysql &
# 驗證啟動成功
sleep 3
mysql -u root -e "SELECT 1;"
# MySQL 8.0+
mysql -u root -e "
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewRootPass123!';
"
# MySQL 5.7
mysql -u root -e "
FLUSH PRIVILEGES;
UPDATE mysql.user SET authentication_string=PASSWORD('NewRootPass123!') WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;
"
# MariaDB 10.2+
mysql -u root -e "
FLUSH PRIVILEGES;
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('NewRootPass123!');
FLUSH PRIVILEGES;
"
# 停止 skip-grant-tables 實例
mysqladmin -u root -p'NewRootPass123!' shutdown
# 或
pkill -f mysqld
# 正常啟動
systemctl start mysqld
# 或
mysqld_safe --user=mysql &
# 驗證新密碼
mysql -u root -p'NewRootPass123!' -e "SELECT USER(), VERSION();"
# 1. 停止服務 (管理員 CMD/PowerShell)
net stop MySQL80
# 或
sc stop MySQL80
# 2. 命令行跳過權限啟動 (控制台模式,可見日誌)
cd "C:\Program Files\MySQL\MySQL Server 8.0\bin"
mysqld --skip-grant-tables --skip-networking --console
# 3. 新開 CMD 視窗無密登入更新密碼
mysql -u root
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewRootPass123!';
QUIT;
# 4. 關閉控制台實例 (Ctrl+C 或 Ctrl+Break)
# 5. 正常啟動服務
net start MySQL80
# 6. 驗證
mysql -u root -pNewRootPass123! -e "SELECT VERSION();"
| 陷阱 | 現象 | 解決 |
|---|---|---|
| mysqld_safe 守護進程自動重啟 | kill mysqld 後立即重生 | 先 kill mysqld_safe 父進程,再 kill mysqld |
| 忘記 FLUSH PRIVILEGES | 密碼更新但不生效 | 更新語句前後必須 FLUSH PRIVILEGES (8.0 ALTER USER 自動刷新,但保留習慣無害) |
| Windows 控制台關閉導致進程結束 | 關閉 CMD 視窗 mysqld 退出 | 用 --console 保持前台,或開兩個 CMD 視窗 |
| 8.0 authentication_string vs Password | UPDATE mysql.user SET Password=... 不生效 | 8.0 用 ALTER USER 或 UPDATE authentication_string |
| 密碼策略拒絕弱密碼 | ERROR 1819 (HY000) | 密碼 ≥12 位、大小寫、數字、特殊字符;或暫時降低 validate_password 等級 |