mysqld_safe --skip-grant-tables 啟動時不載入權限表,任何用戶均可無密碼以任意身份 (含 root) 連接並擁有所有權限。屬緊急手段,**務必配合 --skip-networking 禁止外部連接**。
# 1. 停止服務
systemctl stop mysqld
# 2. 跳過權限表啟動 (前台運行,另開終端操作第 3 步)
mysqld_safe --skip-grant-tables --skip-networking &
# 3. 免密登入並改密
mysql -u root
# 進入 mysql> 交互模式
-- 5.7.6+ / 8.0
FLUSH PRIVILEGES; -- 8.0 必須先執行
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass123!';
-- 5.6 / 5.7.5
UPDATE mysql.user SET Password = PASSWORD('NewStrongPass123!') WHERE User = 'root';
FLUSH PRIVILEGES;
# 4. 關閉臨時實例,正常重啟
mysqladmin -u root -p shutdown # 輸入新密碼
systemctl start mysqld
# 5. 驗證
mysql -u root -p'NewStrongPass123!' -e "SELECT 'OK';"
net stop mysql (或服務管理器停止)。cd "C:\Program Files\MySQL\MySQL Server 8.0\bin"。mysqld --console --skip-grant-tables --skip-networking (窗口保持開啟)。mysql -u root → 執行上述 SQL 修改密碼。net start mysql。| 版本 | 密碼列 | 修改語句 | 注意 |
|---|---|---|---|
| 8.0 / 5.7.6+ | authentication_string | ALTER USER ... IDENTIFIED BY | 必須先 FLUSH PRIVILEGES;PASSWORD() 棄用 |
| 5.6 / 5.7.5 | Password | UPDATE ... SET Password = PASSWORD(...) | 直接 UPDATE |
| 5.5 及更早 | Password | UPDATE ... SET Password = PASSWORD(...) | 同 5.6 |
--skip-networking:全網暴露無密 root,極度危險。'root'@'127.0.0.1' vs 'root'@'localhost',建議全改:WHERE User='root'。FLUSH PRIVILEGES 報錯,需從備份恢復 mysql 库。validate_password 強制複雜度、過期輪換。Root 密碼遺失不恐慌,停服務 → skip-grant-tables+skip-networking 啟動 → 免密登入 → ALTER USER 改密 → 正常重啟,全程 < 3 分鐘。關鍵細節:8.0 必須先 FLUSH PRIVILEGES、務必加 skip-networking、驗證所有 root@host 均已同步修改。事後納入密碼輪換體系,杜絕下次「忘記」。