首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 5.7 忘記 root 密碼重置與修改完整指南(含 authentication_string 變更)

     編輯:MySQL 綜合教學

MySQL 5.7 忘記 root 密碼重置與修改完整指南(含 authentication_string 變更)

MySQL 5.7 引入重大安全架構變更:user 表移除 password 欄位,改用 authentication_string 儲存加密密碼,並預設使用 caching_sha2_password 驗證插件。本文提供針對 5.7 特性的完整重置流程,涵蓋免密模式、密碼更新、權限刷新、驗證插件相容性處理,並對比 5.6/8.0 差異,避免踩坑。


核心變更速覽(5.7 vs 5.6)

項目MySQL 5.6MySQL 5.7
密碼欄位password (CHAR(41))authentication_string (TEXT)
預設驗證插件mysql_native_passwordcaching_sha2_password
PASSWORD() 函數支援支援但不建議(5.7.6+ 棄用,8.0 移除)
ALTER USER不支援**標準修改密碼語法**
首次安裝隨機密碼無~/.mysql_secret 檔案

方案一:標準免密重置流程(適用忘記密碼)

步驟 1:停止 MySQL 服務


[root@server ~]# service mysql stop
# 或 systemctl stop mysqld

步驟 2:跳過授權表啟動(建議加 --skip-networking 禁用遠程連接)


[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 參數。

步驟 3:無密登入並更新密碼


[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;

步驟 4:重啟服務並驗證


[root@server ~]# service mysql restart
[root@server ~]# mysql -u root -p123qwe

步驟 5:強制刷新驗證插件(關鍵補充步驟)

僅執行上述步驟後,部分操作可能仍受限(如建立用戶、授權),需額外執行:


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'@'%';"

5.7 → 8.0 升級密碼遷移提醒

  • 8.0 移除 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。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved