遺忘Root密碼是資料庫運維常見急救場景。本文提供標準化skip-grant-tables繞過權限驗證重置密碼流程,涵蓋Windows/Linux雙平台、MySQL 5.7+認證插件變更應對、安全復原與驗證全過程。
skip-grant-tables啟動時跳過權限表載入,允許無密碼以Root身份連接,進而直接更新mysql.user表重置密碼。
| 平台 | 配置文件路徑 |
|---|---|
| Windows | %MYSQL_INSTALL_DIR%\my.ini (通常在安裝目錄) |
| Linux | /etc/my.cnf 或 /etc/mysql/my.cnf |
在[mysqld]區段添加:
skip-grant-tables
保存退出。
| 平台 | 命令 |
|---|---|
| Windows | net stop mysql → net start mysql |
| Linux (Systemd) | systemctl restart mysqld |
| Linux (SysV) | /etc/init.d/mysqld restart |
mysql -u root -p
# 密碼提示直接回車(空密碼)
-- MySQL 5.7.6+ (authentication_string 欄位)
UPDATE mysql.user SET authentication_string=PASSWORD('NewP@ssw0rd') WHERE User='root';
FLUSH PRIVILEGES;
-- MySQL 5.7.6- / 5.6 / 5.5 (password 欄位)
UPDATE mysql.user SET password=PASSWORD('NewP@ssw0rd') WHERE User='root';
FLUSH PRIVILEGES;
-- MySQL 8.0+ (caching_sha2_password 插件)
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewP@ssw0rd';
FLUSH PRIVILEGES;
⚠️ 版本差異關鍵:5.7.6引入authentication_string替代password,8.0預設caching_sha2_password需用ALTER USER。
skip-grant-tables行mysql -u root -p'NewP@ssw0rd' -e "SELECT 1;"-- 清理匿名用戶
DELETE FROM mysql.user WHERE User='';
-- 禁止Root遠程登入 (僅本機)
UPDATE mysql.user SET Host='localhost' WHERE User='root';
-- 刪除test庫權限
DELETE FROM mysql.db WHERE Db='test' OR Db='test_%';
FLUSH PRIVILEGES;
sc query state=all | findstr mysql
# 找到服務名,如 MySQL57
net stop MySQL57
net start MySQL57
若systemctl restart mysqld未生效配置變更,檢查systemctl cat mysqld中EnvironmentFile指向的配置文件是否正確。
SHOW VARIABLES LIKE 'validate_password%';確認密碼策略skip-grant-tables殘留標準化三步走流程,配合版本差異處理與安全同步加固,讓Root密碼遺忘從「恐慌事件」變為「標準操作」。