MySQL 5.7 引入重大安全架構變更:mysql.user 表移除 Password 列,改用 authentication_string 存儲加密密碼;密碼過期策略、驗證插件機制全面升級。本文提供 5.7 修改 root 密碼的標準流程、緊急重置方案、常見坑點及驗證清單。
| 項目 | MySQL 5.6 | MySQL 5.7+ |
|---|---|---|
| 密碼存儲列 | Password (char(41)) | authentication_string (text) |
| 默認驗證插件 | mysql_native_password | mysql_native_password / caching_sha2_password (8.0) |
| 密碼過期 | 不支持 | 支持 PASSWORD EXPIRE |
| SET PASSWORD 語法 | SET PASSWORD FOR 'user'@'host' = PASSWORD('pwd') | 同 5.6,但操作 authentication_string |
| 推薦語法 | 同上 | ALTER USER 'user'@'host' IDENTIFIED BY 'pwd' |
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass123!';
FLUSH PRIVILEGES;
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('NewPass123!');
FLUSH PRIVILEGES;
UPDATE mysql.user
SET authentication_string = PASSWORD('NewPass123!')
WHERE User = 'root' AND Host = 'localhost';
FLUSH PRIVILEGES;
⚠️ 注意:5.7 中 PASSWORD() 函數返回的哈希值直接寫入 authentication_string。
systemctl stop mysqld
# 或
killall -TERM mysqld
# 僅本地訪問,生產環境務必加 --skip-networking
mysqld_safe --skip-grant-tables --skip-networking &
mysql -uroot
# 進入客戶端後
UPDATE mysql.user
SET authentication_string = PASSWORD('NewPass123!')
WHERE User = 'root' AND Host = 'localhost';
FLUSH PRIVILEGES;
QUIT;
killall -TERM mysqld
mysqld_safe &
# 或 systemctl start mysqld
mysql -uroot -p'NewPass123!'
# 登入後執行(解決 5.7 密碼過期/插件問題)
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass123!';
# 或
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('NewPass123!');
原因:--skip-grant-tables 模式下修改的密碼可能未觸發驗證插件初始化、密碼過期時間重置,需正常模式下再次 ALTER USER 固化。
| 現象 | 原因 | 解決 |
|---|---|---|
ERROR 1820 (HY000): You must reset your password using ALTER USER | 密碼標記為過期 | ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpwd'; |
ERROR 1064: You have an error in your SQL syntax | 密碼含特殊字符未轉義 | 單引號包裹,特殊字符轉義:'New\@Pass\!' |
| 修改後無法遠程連接 | Host 非 '%' 或 '具體 IP' | CREATE USER 'root'@'%' IDENTIFIED BY 'pwd'; GRANT ALL ON *.* TO 'root'@'%' WITH GRANT OPTION; |
ERROR 1396: Operation CREATE USER failed | 用戶已存在 | 先 DROP USER 或直接 ALTER USER |
| 修改密碼後主從報錯 | 從庫還用舊密碼連主庫 | 從庫執行 CHANGE MASTER TO MASTER_PASSWORD='newpwd'; START SLAVE; |
validate_password 插件強制複雜度(長度≥12、大小寫、數字、特殊字符)audit_log 記錄所有賬號變更操作MySQL 5.7 密碼管理核心在於 authentication_string 列與 ALTER USER 語法。常規修改用 ALTER USER,忘記密碼用 --skip-grant-tables --skip-networking 緊急重置,隨後必須正常模式下再次 ALTER USER 固化。構建「強密碼策略、賬號分離、定期輪換、審計追蹤」的全生命週期管理體系,才是根本之道。