明明輸入正確的 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 在權限系統中是完全不同的兩個主機,這是導致「密碼正確但無法登錄」的核心原因。
User、Host、Password 三元組localhostuser 表無 root@localhost 記錄,即便有 root@127.0.0.1 或 root@hostname,認證仍會失敗# 停止服務
systemctl stop mysqld
# 啟動參數添加 --skip-grant-tables
mysqld_safe --skip-grant-tables --skip-networking &
# 或修改 my.cnf [mysqld] 區段添加 skip-grant-tables 後重啟
--skip-networking 禁止網絡連接,確保修復期間安全。
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,請根據版本調整。
# 關閉跳過權限模式進程
mysqladmin -u root shutdown
# 移除 my.cnf 中的 skip-grant-tables 或不帶參數啟動
systemctl start mysqld
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 權限模型,是避免此類問題的關鍵。
