Root 密碼遺失是 DBA 必經的「成人禮」。本文提供三種經實戰驗證的恢復方案:跳過授權表啟動法 (標準)、用戶表檔案複製法 (跨實例)、十六進制編輯法 (極端環境),並深度解析各方案原理、適用場景、風險點與生產級操作規範。
systemctl stop mysqld
# 或
service mysqld stop
cat > /tmp/reset_root.sql <<'EOF'
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass@2024';
DELETE FROM mysql.user WHERE User='';
DELETE FROM mysql.user WHERE User='root' AND Host!='localhost';
FLUSH PRIVILEGES;
EOF
mysqld --init-file=/tmp/reset_root.sql --skip-grant-tables --skip-networking --user=mysql &
參數解析:
--init-file:啟動時執行 SQL,繞過密碼驗證直接修改--skip-grant-tables:不載入授權表,允許無密碼連線 (但配合 init-file 實際不需連線)--skip-networking:**關鍵** — 禁用 TCP 監聽,防止跳過授權期間外部連線入侵--user=mysql:指定運行使用者,避免檔案權限混亂# 觀察錯誤日誌確認 init-file 執行成功
tail -f /var/log/mysql/error.log
# 關閉臨時實例
pkill -f "mysqld.*init-file"
# 正常啟動
systemctl start mysqld
mysql -u root -p'NewStrongPass@2024' -e "SELECT USER(), VERSION();"
# 5.7.5 前使用 PASSWORD() 函數
UPDATE mysql.user SET Password = PASSWORD('NewPass') WHERE User='root';
# 5.7.6+ authentication_string 欄位取代 Password
UPDATE mysql.user SET authentication_string = '' WHERE User='root'; -- 先清空
-- 或直接用 ALTER USER (推薦)
mysql.user 表檔案備份 (.frm, .MYD, .MYI / .ibd)systemctl stop mysqldcp /var/lib/mysql/mysql/user.* /tmp/user_backup/scp source_host:/var/lib/mysql/mysql/user.frm /var/lib/mysql/mysql/
scp source_host:/var/lib/mysql/mysql/user.MYD /var/lib/mysql/mysql/
scp source_host:/var/lib/mysql/mysql/user.MYI /var/lib/mysql/mysql/
chown mysql:mysql /var/lib/mysql/mysql/user.*
chmod 660 /var/lib/mysql/mysql/user.*
systemctl start mysqld && mysql -u root -p'KnownPass'ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass@2024';
DELETE FROM mysql.user WHERE User='';
DELETE FROM mysql.user WHERE User='root' AND Host!='localhost';
FLUSH PRIVILEGES;
mysql.user 為 InnoDB 表,單獨複製 .ibd **不可行** (需表空間 ID 匹配、資料字典一致)mysqldump 導出 mysql.user 邏輯備份,再導入*HASH)myisamchk -r 重建索引cp /var/lib/mysql/mysql/user.MYD /tmp/user.MYD.bak/var/lib/mysql/mysql/user.MYDmyisamchk -r /var/lib/mysql/mysql/user| 階段 | 必做項目 | 禁忌 |
|---|---|---|
| 準備 | 通知相關方、記錄操作日誌、備份關鍵檔案 | 直接在生產庫未備份操作 |
| 執行 | 使用 --skip-networking、指定 --user=mysql | 跳過授權表時開放網路監聽 |
| 驗證 | 新密碼登入、檢查匿名帳號、檢查遠端 root | 僅測試連線未檢查權限 |
| 事後 | 輪換所有應用帳號密碼、審計授權表、更新密碼管理系統 | 密碼重置後未同步應用配置 |
mysqladmin ping 失敗告警、錯誤日誌 Access denied 告警Root 密碼恢復**方案一 (--init-file + --skip-grant-tables + --skip-networking) 為標準首選**,安全可控、版本通用。方案二適用於有同質備用實例的跨實例同步場景。方案三僅作原理理解,**嚴禁生產實施**。核心鐵律:**操作前備份、跳過授權必禁網路、事後必輪換相關憑證、自動化消除人為風險**。