啟動參數 `--skip-grant-tables` 讓 `mysqld` **不載入 `mysql.user` 權限表**,所有連線視為無需認證的超級用戶。隨後更新 `user` 表密碼欄位,重啟正常模式即可。
# Systemd 系統 systemctl stop mysqld # 或 service mysql stop # 傳統 SysV /etc/init.d/mysql stop # 確認進程已終結 ps aux | grep mysqld # 若殘留進程強制結束 killall -TERM mysqld
# 方法 A:mysqld_safe 腳本(推薦,含自動重啟監控) mysqld_safe --skip-grant-tables --skip-networking & # 方法 B:直接啟動 mysqld(需手動指定 datadir/socket 等參數) mysqld --skip-grant-tables --skip-networking --datadir=/var/lib/mysql --socket=/var/run/mysqld/mysqld.sock &
⚠️ **關鍵參數** `--skip-networking`:僅允許本地 Unix Socket 連線,**阻斷網路埠 3306**,防止無認證狀態下被遠端存取。
mysql -u root
# 進入 mysql> 提示符
# MySQL 5.7.6+ / 8.0+ (authentication_string 欄位)
UPDATE mysql.user SET authentication_string = PASSWORD('NewStrongPass2024!') WHERE User = 'root';
FLUSH PRIVILEGES;
# MySQL 5.7.5 及之前 (password 欄位)
UPDATE mysql.user SET Password = PASSWORD('NewStrongPass2024!') WHERE User = 'root';
FLUSH PRIVILEGES;
# 8.0 另一種標準語法
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass2024!';
# 結束跳過權限模式進程 mysqladmin -u root shutdown # 或 killall -TERM mysqld # 正常啟動 systemctl start mysqld # 或 service mysql start # 驗證新密碼 mysql -u root -p'NewStrongPass2024!' -e "SELECT VERSION();"
# 1. 以管理員身份開啟 CMD/PowerShell # 2. 停止服務 net stop mysql # 或 sc stop mysql # 3. 跳過權限啟動 (在 mysqld.exe 目錄下) cd "C:\Program Files\MySQL\MySQL Server 8.0\bin" mysqld --skip-grant-tables --skip-networking # 4. **新開視窗** 連線修改密碼 (同上 Linux 步驟 3) # 5. 關閉視窗結束 mysqld → 正常啟動服務 net start mysql
# 1. 停止容器 docker stop mysql-container # 2. 以跳過權限模式啟動臨時容器掛載相同 volume docker run --rm -it --volumes-from mysql-container \ mysql:8.0 mysqld --skip-grant-tables --skip-networking --user=mysql # 3. 另一終端機連線臨時容器 (需知容器 IP 或用 docker exec) docker exec -itmysql -u root # 執行 UPDATE 密碼... # 4. 停止臨時容器 → 正常啟動原容器 docker start mysql-container
| 現象 | 原因 | 解決 |
|---|---|---|
| mysql 連線報 Can't connect to socket | Socket 路徑不匹配 | 指定 `--socket=/var/run/mysqld/mysqld.sock` 或 `--protocol=tcp --port=3306` |
| UPDATE 後 FLUSH PRIVILEGES 報錯 | --skip-grant-tables 下權限表唯讀 | 8.0+ 用 ALTER USER 語法;或重啟正常模式後再 FLUSH |
| Windows 服務啟動失敗 | 參數語法錯誤/路徑含空格未加引號 | 檢查 ImagePath 雙引號包裹、參數前有空格 |
| Docker 容器無法連線 | 網路隔離/卷掛載錯誤 | 用 `--network container:mysql-container` 共用網路命名空間 |
Root 密碼重置是 DBA 必備生存技能。掌握「停服務 → 跳過權限 → 改密碼 → 正常啟動」四步曲,配合 `--skip-networking` 安全隔離與跨平台適配,3 分鐘內找回控制權。事後務必落實密碼策略與最小權限原則,將單點風險降至最低。