遺忘 MySQL root 密碼是常見運維場景。本文提供 **Windows 全版本** 通用的跳過權限表重置密碼流程,含圖文步驟、命令行操作、服務管理、驗證登入全過程。
以 --skip-grant-tables 參數啟動 MySQL,**跳過權限系統驗證**,以空密碼 root 登入,更新 mysql.user 表的 authentication_string(5.7+)或 Password(5.6),刷新權限,重啟正常模式。
# 方式一:服務管理器
services.msc → 找到 MySQL / MySQL80 → 右鍵「停止」
# 方式二:命令列(管理員權限)
net stop mysql
net stop MySQL80
# 方式三:任務管理器殺進程
taskkill /f /im mysqld.exe
# 打開 CMD(管理員),切換到 MySQL bin 目錄
cd "C:\Program Files\MySQL\MySQL Server 8.0\bin"
# 啟動跳過權限表(控制台前台運行,保持視窗開啟)
mysqld --defaults-file="C:\ProgramData\MySQL\MySQL Server 8.0\my.ini" --console --skip-grant-tables
# 關鍵參數:
# --defaults-file: 指定配置檔路徑(必須絕對路徑,含空格需加引號)
# --console: 輸出日誌到控制台
# --skip-grant-tables: 跳過權限表,允許無密碼 root 登入
⚠️ **此視窗不可關閉**,關閉即停止 mysqld 進程。
cd "C:\Program Files\MySQL\MySQL Server 8.0\bin"
mysql -u root -p
# 提示 Enter password: 直接按 Enter(空密碼)
-- 切換到 mysql 系統庫
USE mysql;
-- MySQL 5.7+ / 8.0:authentication_string 欄位
UPDATE user SET authentication_string = PASSWORD('NewPass123!') WHERE User = 'root' AND Host IN ('localhost', '127.0.0.1', '::1', '%');
-- MySQL 5.6:Password 欄位
-- UPDATE user SET Password = PASSWORD('NewPass123!') WHERE User = 'root';
-- 刷新權限(必須)
FLUSH PRIVILEGES;
-- 退出
QUIT;
# 關閉 --skip-grant-tables 的 mysqld 控制台(Ctrl+C 或關閉視窗)
# 正常啟動服務
net start mysql
# 或 services.msc 啟動
# 驗證新密碼登入
mysql -u root -p
Enter password: NewPass123!
# 成功進入 mysql> 提示符
| 問題 | 原因 | 解決 |
|---|---|---|
| mysqld 啟動即閃退 | 配置檔路徑錯誤、datadir 權限、端口佔用 | 檢查 --defaults-file 路徑;以管理員運行;netstat -an | findstr 3306 |
| ERROR 1290: The MySQL server is running with --skip-grant-tables | 未執行 FLUSH PRIVILEGES | 執行 FLUSH PRIVILEGES 後再 UPDATE |
| 密碼策略不滿足 | validate_password 元件要求複雜度 | 密碼含大小寫、數字、特殊符號、長度≥8;或暫時降低策略 SET GLOBAL validate_password.policy=LOW |
| Host '%' 不存在 | root 只有 localhost/127.0.0.1 | WHERE 子句加上實際 Host 值,或新增 '%' 宿主 |
# 舊版無 mysqld.exe,只有 mysqld-nt.exe
mysqld-nt --skip-grant-tables
# 後續步驟相同
UPDATE user SET Host='127.0.0.1' WHERE User='root'; FLUSH PRIVILEGES;validate_password 強制複雜度。