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

Linux CentOS 7 MySQL 5.7 Root 登入失敗完整解決方案:跳過權限表重置密碼

     編輯:MySQL 綜合教學

Linux CentOS 7 MySQL 5.7 Root 登入失敗完整解決方案:跳過權限表重置密碼

在 CentOS 7 透過 yum 安裝 MySQL 5.7 後,首次以 root 登入常遇到 ERROR 1045 (28000): Access denied for user 'root'@'localhost'。本文提供經實測驗證的標準解決流程,並解析 5.7 版密碼機制變更的根本原因。

錯誤現象與原因分析

$ mysql -u root -p
Enter password: 
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

關鍵差異:

  • using password: NO → 未提供密碼,或密碼為空
  • using password: YES → 提供了密碼但錯誤

根本原因:MySQL 5.7+ 出於安全考慮,**不再預設空密碼**,且不再生成 /root/.mysql_secret 檔案。安裝過程中若未互動設定密碼,root 帳號會處於「密碼過期」或「無有效認證字串」狀態,導致無法登入。

標準解決流程:--skip-grant-tables 重置密碼

適用版本:MySQL 5.7 / 8.0 (語法略有不同,見下文)

步驟 1:停止 MySQL 服務

systemctl stop mysqld
# 或舊版指令
service mysqld stop

步驟 2:編輯配置檔啟用 skip-grant-tables

vim /etc/my.cnf
# 在 [mysqld] 區段末尾新增
skip-grant-tables

步驟 3:啟動 MySQL 服務 (此時無需密碼可登入)

systemctl start mysqld

步驟 4:免密登入並修改密碼

mysql -u root -p
# 直接按 Enter (無需密碼)
MariaDB [(none)]> USE mysql;
# MySQL 5.7 欄位名為 authentication_string
UPDATE user SET authentication_string=PASSWORD('NewStrongPass123!'), password_expired='N' WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;
QUIT;

關鍵點:MySQL 5.7 user 表已移除 Password 欄位,改用 authentication_string 儲存加密密碼。同時將 password_expired 設為 'N' 解除過期狀態。

步驟 5:恢復配置並重啟驗證

# 移除 skip-grant-tables
vim /etc/my.cnf
# 刪除或註解該行

systemctl restart mysqld

# 驗證新密碼
mysql -u root -p'NewStrongPass123!'
# 或交互式輸入密碼

步驟 6:(必要) 執行 ALTER USER 完成密碼初始化

MySQL 5.7 密碼過期機制要求首次登入後必須透過 ALTER USER 重新設定密碼,否則後續操作受限:

mysql -u root -p
# 輸入新密碼登入
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass123!';
# 或舊語法 (仍支援)
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('NewStrongPass123!');

MySQL 8.0 語法差異補充

MySQL 8.0 PASSWORD() 函式已移除,認證採用 caching_sha2_password 插件:

-- 8.0 修改密碼標準語法
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass123!';
-- 或指定插件相容舊客戶端
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'NewStrongPass123!';

常見誤區與避坑

  1. 誤以為預設密碼為空:5.6 以前版本才預設空密碼,5.7+ 嚴禁。
  2. 尋找 .mysql_secret 檔案:僅 MariaDB 或特定舊版 MySQL 會生成,標準 yum 安裝 5.7 不會產生。
  3. 修改 user 表後未 FLUSH PRIVILEGES:權限快取未更新,新密碼不生效。
  4. 未設定 password_expired='N':帳號仍處於過期狀態,登入後無法執行任何查詢。
  5. 跳過 ALTER USER 步驟:導致應用程式連線報錯 ERROR 1820 (HY000): You must SET PASSWORD。

安全加固建議

  • 密碼複雜度:≥12 字元,含大小寫、數字、特殊符號。
  • 禁止 root 遠程登入:UPDATE user SET Host='localhost' WHERE User='root';
  • 建立應用專用帳號,授予最小權限:GRANT SELECT, INSERT ON app_db.* TO 'app_user'@'%' IDENTIFIED BY '...';
  • 啟用密碼過期策略:default_password_lifetime=90 (見相關文章)。

總結

MySQL 5.7 root 登入失敗本質是「安裝未設定密碼導致帳號處於過期/無效狀態」。透過 skip-grant-tables 繞過權限檢查,直接操作 mysql.user 表更新 authentication_string 並解除過期,再恢復權限驗證並執行 ALTER USER 完成初始化,是標準且安全的解決路徑。

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