首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL Root 密碼正確卻無法本地登錄?宿主缺失導致的訪問拒絕完整解決方案

     編輯:MySQL 資料庫相關知識

問題現象

明明輸入正確的 Root 密碼,卻在本地登錄 MySQL 時遭遇拒絕:

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

經排查發現,mysql.user 表中缺少 Host='localhost' 的 Root 賬戶記錄,僅存在 Host='主機名' 或 Host='127.0.0.1' 的條目。MySQL 連接時會精確匹配 User+Host,localhost 與 127.0.0.1 在權限系統中是完全不同的兩個主機,這是導致「密碼正確但無法登錄」的核心原因。

根因分析

  • MySQL 權限認證基於 User、Host、Password 三元組
  • 本地連接時,客戶端默認使用 Unix Socket,解析主機為 localhost
  • 若 user 表無 root@localhost 記錄,即便有 root@127.0.0.1 或 root@hostname,認證仍會失敗
  • 常見於手動刪除賬戶、不完整的初始化腳本、或跨版本升級導致權限表結構變更

解決方案:跳過權限表修復賬戶

步驟 1:以跳過權限模式啟動 MySQL

# 停止服務
systemctl stop mysqld

# 啟動參數添加 --skip-grant-tables
mysqld_safe --skip-grant-tables --skip-networking &
# 或修改 my.cnf [mysqld] 區段添加 skip-grant-tables 後重啟

--skip-networking 禁止網絡連接,確保修復期間安全。

步驟 2:無密碼登錄並修復權限表

mysql -u root

進入 MySQL 後執行:

USE mysql;

-- 方案 A:更新現有記錄的 Host 為 localhost(推薦保留原有權限)
UPDATE user SET Host='localhost' WHERE User='root' AND Host='127.0.0.1' LIMIT 1;

-- 方案 B:插入新記錄(若無可用記錄更新)
INSERT INTO user (Host, User, authentication_string, ssl_cipher, x509_issuer, x509_subject)
VALUES ('localhost', 'root', '', '', '', '');

-- 刷新權限生效
FLUSH PRIVILEGES;

注意:MySQL 5.7+ 密碼列為 authentication_string,5.6 為 Password,請根據版本調整。

步驟 3:重新啟動 MySQL 正常模式

# 關閉跳過權限模式進程
mysqladmin -u root shutdown

# 移除 my.cnf 中的 skip-grant-tables 或不帶參數啟動
systemctl start mysqld

步驟 4:驗證修復結果

mysql -u root -p -h localhost
# 輸入密碼,應可正常登錄

進階排查:確保三元組完整

建議確保 Root 賬戶擁有完整的三條核心記錄:

SELECT User, Host FROM mysql.user WHERE User='root';
+------+-------------+
| User | Host        |
+------+-------------+
| root | localhost   |  <-- 必須存在,Socket 連接用
| root | 127.0.0.1   |  <-- TCP 本地連接用
| root | ::1         |  <-- IPv6 本地連接用(可選)
| root | %           |  <-- 遠程連接用(按需開放)
+------+-------------+

缺少任一條目都可能導致對應連接方式失敗。

預防措施

  • 使用 mysql_secure_installation 初始化安裝,自動創建完整權限集
  • 避免手動 DELETE FROM mysql.user,改用 DROP USER、RENAME USER 等 SQL 語句
  • 版本升級後務必執行 mysql_upgrade 更新權限表結構
  • 定期備份 mysql 系統庫

總結

「密碼正確但無法登錄」本質上是 Host 匹配失敗。通過 --skip-grant-tables 繞過認證,補全 root@localhost 記錄即可徹底解決。理解 MySQL User+Host 權限模型,是避免此類問題的關鍵。

MySQL 權限表結構示意圖 跳過權限表登錄修復示例

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