# Linux (systemd)
systemctl stop mysqld
# Windows (管理員 CMD)
net stop MySQL80
# 通用:mysqladmin (需知當前密碼,此處假設不知,跳過)
# 若進程卡死,強制終止
# Linux: kill $(cat /var/run/mysqld/mysqld.pid) → 等 10s → kill -9
# Windows: taskkill /F /PID
關鍵:優先嘗試正常停止,確保 InnoDB 完成检查点、刷新髒頁,減少啟動恢復時間。
# Linux (後台運行)
mysqld_safe --skip-grant-tables --skip-networking &
# Windows (新開 CMD 視窗,前台運行觀察日誌)
mysqld --skip-grant-tables --skip-networking --console
# 參數解讀:
--skip-grant-tables # 不載入權限表,允許無密碼/任意用戶連接
--skip-networking # 禁用 TCP/IP 連接,僅允許本地 Unix Socket / Named Pipe,安全隔離
--console # Windows 下日誌輸出至控制台,便於觀察
# 新開終端/CMD
mysql -u root
# 進入 mysql 系統庫
USE mysql;
-- MySQL 8.0 / 5.7 (authentication_string 欄位)
FLUSH PRIVILEGES; -- 必須先執行,載入授權表結構到內存,否則 UPDATE 無效
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewRootPass123!';
-- 或兼容寫法
UPDATE user SET authentication_string = PASSWORD('NewRootPass123!') WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;
-- 同步修復所有 root 帳號 (%, 127.0.0.1, ::1)
ALTER USER 'root'@'%' IDENTIFIED BY 'NewRootPass123!';
ALTER USER 'root'@'127.0.0.1' IDENTIFIED BY 'NewRootPass123!';
ALTER USER 'root'@'::1' IDENTIFIED BY 'NewRootPass123!';
FLUSH PRIVILEGES;
# 關閉 --skip-grant-tables 實例
# Linux: mysqladmin -u root -p'NewRootPass123!' shutdown
# Windows: mysqladmin -u root -pNewRootPass123! shutdown
# 或 kill 進程
# 正常啟動
systemctl start mysqld 或 net start MySQL80
# 驗證新密碼
mysql -u root -p'NewRootPass123!' -e "SELECT USER(), VERSION();"
| 坑點 | 後果 | 正確做法 |
|---|---|---|
| 未先執行 FLUSH PRIVILEGES 就 UPDATE user | UPDATE 成功但不生效,重啟後密碼仍舊 | **必須**先 FLUSH PRIVILEGES 再修改密碼 |
| 只改 'root'@'localhost' 忽略其他 Host | 遠程/127.0.0.1/::1 連接仍失敗 | 批量修改所有 root Host 記錄 |
| --skip-grant-tables 未加 --skip-networking | 全網暴露無密碼 root 訪問,極高風險 | **永遠**加上 --skip-networking |
| mysqld_safe 後台啟動無日誌可見 | 不知是否成功、錯誤難排查 | 查看錯誤日誌 (log-error 路徑) 或用 --console 前台啟動 |
| Windows 下 mysqld --console 關閉視窗導致進程終止 | 救援中斷 | 開新視窗操作步驟 3,或用服務模式啟動 |
| MySQL 8.0 使用 PASSWORD() 函數報錯 | 8.0 移除 PASSWORD(),改用內部雜湊 | 用 ALTER USER ... IDENTIFIED BY '...' 統一語法 |
# 1. 以管理員身份開啟 CMD
# 2. 停止服務
net stop MySQL80
# 3. 進入 bin 目錄
cd "C:\Program Files\MySQL\MySQL Server 8.0\bin"
# 4. 前台啟動跳過授權 (新視窗)
start cmd /k "mysqld --skip-grant-tables --skip-networking --console"
# 5. 原視窗執行修復
mysql -u root
-- 同步步驟 3 SQL 操作
# 6. 關閉跳過授權視窗 (Ctrl+C 或關閉視窗)
# 7. 正常啟動服務
net start MySQL80
# 8. 驗證
mysql -u root -p'NewRootPass123!'
# --skip-grant-tables 模式下
USE mysql;
-- 檢查 user 表結構
DESC user;
-- 缺失欄位補全 (如 5.7 升 8.0 缺失 password_last_changed 等)
-- 參考官方 mysql_upgrade 腳本或手工 ALTER TABLE ADD COLUMN ...
-- 重建損壞索引
CHECK TABLE user;
REPAIR TABLE user; -- 僅 MyISAM,InnoDB 需重建表
-- 刪除殘留匿名用戶
DELETE FROM user WHERE User='';
-- 刪除非 localhost 的 root (可選,安全加固)
DELETE FROM user WHERE User='root' AND Host NOT IN ('localhost','127.0.0.1','::1');
FLUSH PRIVILEGES;
MySQL Root 密碼恢復不是「黑客技巧」,而是**標準化運維流程**的核心組成部分。掌握 `--skip-grant-tables --skip-networking` → `FLUSH PRIVILEGES` → `ALTER USER` → 正常重啟 的標準動作序列,配合版本差異處理、Windows/Linux 平台適配、權限表修復知識,能將「密碼丟失」從 P0 故障降級為 10 分鐘可解決的常規操作,體現運維工程化的專業素養。