遺忘 MySQL root 密碼是經典運維場景。本文提供兩種官方重置方案:替換 mysql 系統表法(簡單粗暴)與 skip-grant-tables 法(標準流程),並說明權限刷新、安全加固與常見失誤避坑。
原理:用全新安裝的 mysql 資料庫目錄覆蓋舊目錄,重置為出廠預設(root 無密碼)。
service mysqld stopmv /var/lib/mysql/mysql /var/lib/mysql/mysql_oldmysql 目錄:cp -r /path/to/mysql-src/data/mysql /var/lib/mysql/chown -R mysql:mysql /var/lib/mysql/mysqlservice mysqld startmysql -u rootUPDATE mysql.user SET authentication_string=PASSWORD('StrongPass!') WHERE User='root';
DELETE FROM mysql.user WHERE User='';
FLUSH PRIVILEGES;
mysql_old 中的業務授權資料,按需遷移風險:所有歷史授權、存儲程序、事件、視圖定義(儲存在 mysql.db/proc/event 等表)將遺失,需手動遷移。
原理:跳過權限檢查啟動,免密登入修改 mysql.user 表,再重新載入權限。
kill `cat /var/lib/mysql/hostname.pid` # 非 kill -9
# 或
killall -TERM mysqld
mysqld_safe --skip-grant-tables --skip-networking & # --skip-networking 防止外部連入
# 或
/usr/local/mysql/bin/mysqld_safe --skip-grant-tables --skip-networking &
mysql -u root mysql
UPDATE user SET authentication_string=PASSWORD('NewStrongPass!') WHERE User='root';
FLUSH PRIVILEGES;
EXIT;
mysqladmin -u root -p shutdown # 用新密碼關閉
service mysqld start # 正常模式啟動
mysql -u root -p'NewStrongPass!'| 環節 | 易犯錯誤 | 正確做法 |
|---|---|---|
| 停止服務 | 用 kill -9 強殺 | TERM 信號讓 InnoDB 做 checkpoint |
| 啟動 skip-grant-tables | 忘記 --skip-networking | 必須加上,防止無密碼被遠端連入 |
| 修改密碼 | 用 password() 函數(5.7+ 棄用) | MySQL 5.7+ 用 authentication_string 欄位;8.0 用 ALTER USER 'root'@'localhost' IDENTIFIED BY 'pass'; |
| 刷新權限 | 只改表不 FLUSH PRIVILEGES | 必須執行 FLUSH PRIVILEGES 或 mysqladmin flush-privileges |
| 重啟驗證 | 直接用舊密碼測試 | 必須用新密碼登入確認 |
-- 在 skip-grant-tables 模式下
FLUSH PRIVILEGES; -- 8.0 必須先執行,才能 ALTER USER
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass!';
mysql_secure_installation:移除匿名用戶、禁止遠端 root、移除 test DB、載入權限validate_password 插件強制複雜度Root 密碼重置不是目的,事後權限收斂與審計才是核心。建議將重置流程文件化、腳本化,納入災難恢復演練(DR Drill)定期演練,確保關鍵時刻「人人可操作、步步有記錄、分鐘級恢復」。