生產環境嚴禁無故重置 root 密碼,但遺忘、接手舊系統、安全審計需輪換時,skip-grant-tables 是標準應急方案。本文給出 Linux 下完整操作步驟、風險控制、恢復驗證。
skip-grant-tables 讓 mysqld 啟動時跳過權限表加載,任何用戶無密碼即可登錄、擁有所有權限。極度危險,必須:
systemctl stop mysqld
# 或
killall -TERM mysqld
vi /etc/my.cnf
# [mysqld] 區塊下添加
skip-grant-tables
systemctl start mysqld
mysql -u root -p
# 直接回車
-- 5.7.6+ / 8.0
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass#2024';
-- 5.7.6 前
UPDATE mysql.user SET authentication_string=PASSWORD('NewStrongPass#2024') WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;
vi /etc/my.cnf # 刪除或註釋 skip-grant-tables
systemctl restart mysqld
mysql -u root -p'NewStrongPass#2024' -e "SELECT USER();"
| 風險 | 對策 |
|---|---|
| 網絡暴露無認證實例 | 防火牆 iptables -I INPUT -p tcp --dport 3306 -j DROP,操作完恢復 |
| 現有連接繼續持有舊權限 | 重啟後所有連接斷開,強制重新認證 |
| 複製用戶/應用密碼不同步 | 同步修改應用配置、從庫賬號 |
| 權限表損壞導致無法啟動 | 備份 mysql 庫、data 目錄再操作 |
ALTER USER 'root'@'localhost'
IDENTIFIED BY 'NewPass#2024'
PASSWORD EXPIRE INTERVAL 90 DAY
FAILED_LOGIN_ATTEMPTS 3
PASSWORD_LOCK_TIME 2;
建立密碼輪換策略,從根源減少「忘記密碼」事件。