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

MySQL「Host localhost is not allowed to connect」錯誤排查與修復實戰

     編輯:MySQL 資料庫相關知識

故障現象

嘗試以 root 登錄本地 MySQL 時提示:Host 'localhost' is not allowed to connect to this MySQL server。回溯操作發現曾誤將 root 密碼直接設為明文 'YES'(而非哈希值),導致權限表數據異常,進而被拒絕訪問。

錯誤根因

  • 執行 UPDATE user SET Password='YES' WHERE user='root' AND host='localhost'; 將密碼列寫入明文,MySQL 認證機制期望存儲的是 PASSWORD() 加密後的哈希值。
  • 密碼列數據異常導致權限驗證邏輯判斷失敗,拒絕所有來自 localhost 的連接請求。

修復方案:跳過權限表啟動

1. 停止 MySQL 服務

# Windows
sc stop MySQL
# Linux
systemctl stop mysqld  # 或 service mysqld stop

2. 以 --skip-grant-tables 模式啟動

mysqld --skip-grant-tables &

此模式下 MySQL 不加載權限表,允許無密碼、無權限檢查直接進入控制台。僅限本地緊急修復使用,切勿在生產環境長期運行。

3. 另開終端進入控制台修復密碼

mysql -u root
# 進入 mysql> 提示符後執行:
UPDATE mysql.user SET authentication_string=PASSWORD('新密碼') WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;
EXIT;

關鍵點: MySQL 5.7+ 密碼列為 authentication_string,5.6 及之前為 Password;務必使用 PASSWORD() 函數生成哈希值,不可寫入明文。

4. 重啟服務驗證

# 終止 --skip-grant-tables 進程
mysqladmin -u root shutdown
# 正常啟動服務
systemctl start mysqld
# 驗證新密碼
mysql -u root -p

常見誤區與補充說明

  • mysqlcheck --auto-repair 無法修復權限表:該工具針對用戶數據表損壞,權限表屬於系統表,需通過 SQL 直接修正。
  • --skip-grant-tables 僅本地有效:該參數不影響網絡連接權限邏輯,遠程連接仍受權限表約束。
  • 服務無法正常停止:可使用 mysqladmin -u root shutdown 強制關閉。

預防建議

  1. 修改密碼請使用標準語句:ALTER USER 'root'@'localhost' IDENTIFIED BY '新密碼';(MySQL 5.7+)或 SET PASSWORD FOR 'root'@'localhost' = PASSWORD('新密碼');。
  2. 定期備份 mysql 系統庫,尤其是 user、db、tables_priv 等權限相關表。
  3. 生產環境禁用 root 遠程登錄,採用專用應用賬號並限制來源 IP。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved