killall mysqld
# 或
service mysqld stop
mysqld_safe --skip-grant-tables --skip-networking &
# --skip-networking 防止外部連線介入救援過程
mysql -u root
-- MySQL 5.7.6+ / 8.0
UPDATE mysql.user SET authentication_string=PASSWORD('NewStrongPass!23') WHERE User='root';
-- 或 8.0.4+ 推薦
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass!23';
FLUSH PRIVILEGES;
killall mysqld
service mysqld start
# 驗證
mysql -u root -p'NewStrongPass!23'
mysqladmin -u username -p'oldpass' password 'newpass'
# 或 SQL
SET PASSWORD FOR 'username'@'host' = PASSWORD('newpass');
| 現象 | 原因 | 對策 |
|---|---|---|
| 救援後仍無法登入 | Host 欄位不匹配(% vs localhost) | 同時更新 'root'@'localhost' 與 'root'@'%' |
PASSWORD() 函數報錯 | MySQL 8.0.11+ 棄用 | 改用 ALTER USER ... IDENTIFIED BY |
FLUSH PRIVILEGES 無效 | --skip-grant-tables 下權限表不在記憶體 | 必須正常重啟 mysqld 後權限才生效 |
啟動報 mysqld_safe: command not found | 路徑不在 PATH | 使用絕對路徑 /usr/local/mysql/bin/mysqld_safe |
GRANT ALL ON *.* TO 'dba'@'10.0.0.%' IDENTIFIED BY '...' WITH GRANT OPTION;Root 密碼遺忘是 DBA 必經考驡。**核心鍵點:--skip-grant-tables --skip-networking、更新 authentication_string、FLUSH PRIVILEGES、正常重啟**。將流程標準化、腳本化,讓恐慌變成肌肉記憶。