MySQL 5.7 引入重大安全架構變更:user 表移除 password 欄位,改用 authentication_string 儲存加密密碼,並預設使用 caching_sha2_password 驗證插件。本文提供針對 5.7 特性的完整重置流程,涵蓋免密模式、密碼更新、權限刷新、驗證插件相容性處理,並對比 5.6/8.0 差異,避免踩坑。
| 項目 | MySQL 5.6 | MySQL 5.7 |
|---|---|---|
| 密碼欄位 | password (CHAR(41)) | authentication_string (TEXT) |
| 預設驗證插件 | mysql_native_password | caching_sha2_password |
| PASSWORD() 函數 | 支援 | 支援但不建議(5.7.6+ 棄用,8.0 移除) |
| ALTER USER | 不支援 | **標準修改密碼語法** |
| 首次安裝隨機密碼 | 無 | ~/.mysql_secret 檔案 |
[root@server ~]# service mysql stop
# 或 systemctl stop mysqld
[root@server ~]# mysqld_safe --skip-grant-tables --skip-networking &
注意:若系統無
mysqld_safe(如 Ubuntu apt 安裝),改用mysqld --skip-grant-tables --skip-networking &,但需確保指定正確的--datadir、--socket、--pid-file、--user=mysql參數。
[root@server ~]# mysql -u root
mysql> USE mysql;
-- 關鍵:更新 authentication_string 欄位
mysql> UPDATE user SET authentication_string=PASSWORD('123qwe') WHERE User='root' AND Host='localhost';
Query OK, 1 row affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
mysql> QUIT;
[root@server ~]# service mysql restart
[root@server ~]# mysql -u root -p123qwe
僅執行上述步驟後,部分操作可能仍受限(如建立用戶、授權),需額外執行:
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123';
# 或
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123');
這步會由伺服器根據當前驗證插件重新計算並寫入 authentication_string,確保完全生效。
MySQL 5.7 首次啟動會在 root 家目錄生成 .mysql_secret:
[root@server ~]# cat /root/.mysql_secret
# Password set for user 'root@localhost' at 2024-01-15 10:30:00 :Jj+FTiqvyrF
shell> mysql -uroot -p'Jj+FTiqvyrF'
mysql> SET PASSWORD = PASSWORD('newpasswd');
# 1. 停止服務
service mysqld stop
# 2. 免密啟動
mysqld_safe --skip-grant-tables &
# 3. 登入改密
mysql -uroot -p # 直接 Enter
mysql> USE mysql;
mysql> UPDATE user SET authentication_string=PASSWORD("123456") WHERE User="root";
mysql> FLUSH PRIVILEGES;
mysql> QUIT
# 4. 重啟服務
service mysqld restart
# 5. 修正驗證插件(必做)
mysql -uroot -p123456
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
# 方法 1:mysqladmin(需舊密碼)
mysqladmin -u root -h localhost -p'oldpass' password 'newpass'
# 方法 2:SQL 語句(推薦)
mysql -uroot -p'oldpass'
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpass';
# 或
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass');
| 現象 | 原因 | 解決 |
|---|---|---|
| UPDATE 後登入仍報錯 | 未執行 ALTER USER 刷新驗證插件快取 | 務必執行 ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpass'; |
| ERROR 1820 (HY000): You must reset your password | 密碼過期策略生效 | ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpass' PASSWORD EXPIRE NEVER; |
| caching_sha2_password 客戶端不支援 | 舊版驅動/連接器不支援新插件 | 改用 mysql_native_password:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'newpass'; |
| Host 欄位不匹配(%、127.0.0.1) | 只更新 localhost 帳號 | SELECT User, Host FROM user WHERE User='root'; 全部更新 |
| PASSWORD() 函數警告/失效 | 5.7.6+ 棄用,8.0 移除 | 統一使用 ALTER USER ... IDENTIFIED BY 讓伺服器處理加密 |
# 1. 確認密碼欄位已更新
mysql -e "SELECT User, Host, plugin, authentication_string FROM mysql.user WHERE User='root';"
# 2. 驗證新密碼可登入
mysql -uroot -p'newpass' -e "SELECT VERSION(), CURRENT_USER();"
# 3. 檢查權限完整
mysql -uroot -p'newpass' -e "SHOW GRANTS FOR 'root'@'localhost';"
# 4. 測試建立用戶授權(驗證插件生效)
mysql -uroot -p'newpass' -e "CREATE USER 'test'@'%' IDENTIFIED BY 'test'; GRANT SELECT ON *.* TO 'test'@'%';"
PASSWORD() 函數,mysql_native_password 降為次要選項caching_sha2_password 或 mysql_native_password 並重置密碼mysql_upgrade 工具會自動處理系統表結構遷移5.7 重置核心口訣:停服務 →
mysqld_safe --skip-grant-tables --skip-networking→UPDATE authentication_string→FLUSH PRIVILEGES→ 重啟 →ALTER USER IDENTIFIED BY(關鍵!) → 驗證。記住:5.7 改密不完整,直到跑過 ALTER USER。