Root 密碼遺失是 DBA 必經之痛。本文提供三種找回方案(跳過授權表、配置文件法、init-file 法)與三種修改姿勢,覆蓋 MySQL 5.6~8.0、Linux/Windows 全場景。
# 1. 停止服務
systemctl stop mysqld
# 2. 跳過授權表啟動
mysqld_safe --skip-grant-tables --skip-networking &
# 3. 無密登入並修改
mysql -u root
FLUSH PRIVILEGES; -- 5.7+ 必須先執行
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass123!'; -- 5.7.6+/8.0
-- 或舊版:UPDATE mysql.user SET authentication_string=PASSWORD('NewPass123!') WHERE User='root';
FLUSH PRIVILEGES;
EXIT;
# 4. 正常重啟
systemctl restart mysqld
關鍵點:--skip-networking 防止外部連入風險窗口;5.7+ 必須 FLUSH PRIVILEGES 後才能改密碼。
[mysqld]
skip-grant-tables
加入 /etc/my.cnf,重啟服務,同方案一步驟 3 修改密碼,最後刪除該行並重啟。
# 1. 建立初始化腳本 /tmp/init_root.sql
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass123!';
# 2. 啟動時載入
mysqld --init-file=/tmp/init_root.sql --user=mysql &
# 3. 見日誌顯示 "ready for connections" 後殺掉進程,正常重啟
優勢:全自動化、無交互視窗、適合 Ansible/Docker 入口腳本。
| 方法 | 命令 | 適用場景 |
|---|---|---|
mysqladmin | mysqladmin -u root -p'old' password 'new' | 命令列快速改密,脚本友好 |
ALTER USER | ALTER USER 'root'@'localhost' IDENTIFIED BY 'new'; | 5.7.6+ 標準 SQL,支援密碼策略驗證 |
SET PASSWORD | SET PASSWORD FOR 'root'@'localhost' = 'new'; | 8.0 推薦,會話級立即生效 |
validate_password.policy 可能要求長度/特殊字符,新密碼需達標。caching_sha2_password,舊客戶端需改 mysql_native_password 或升級驅動。CHANGE MASTER TO MASTER_PASSWORD='new' 並 START SLAVE。建議將找回腳本納入運行手冊,季度演練一次,真正出事時才不會手忙腳亂。