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

MySQL 主機被屏蔽 (Host 'host_name' is blocked) 徹底解決方案

     編輯:MySQL 資料庫相關知識

錯誤現象

ERROR 1129 (HY000): Host 'host_name' is blocked because of many connection errors.
Unblock with 'mysqladmin flush-hosts'

預設情況下,MySQL 在同一主機累積 10 次連線錯誤 後,會自動屏蔽該主機後續連線請求,直至執行 FLUSH HOSTS 或重啟服務。

核心機制

  • 計數器: max_connect_errors 系統變數控制容錯閾值,預設 10。
  • 觸發條件: TCP/IP 連線中斷、認證失敗、握手超時等「中斷連線請求」。
  • 防禦邏輯: 認定該主機可能發動攻擊或網路異常,主動切斷防止資源耗盡。

三種解除屏蔽方案

方案 1:即時解除(推薦首選)

mysqladmin flush-hosts -u root -p
# 或登入 MySQL 執行
FLUSH HOSTS;

清空主機快取計數器,立即恢復該主機連線權限,無需重啟服務。

方案 2:調大容錯閾值(治標)

修改啟動參數或執行期變數:

-- 啟動參數 (my.cnf)
[mysqld]
max_connect_errors = 10000

-- 執行期動態調整 (需 SUPER 權限)
SET GLOBAL max_connect_errors = 10000;

將閾值從 10 提升至 10000,減少誤判頻率,但無法解決根本網路/程式問題。

方案 3:根因排查與修復(治本)

  1. 驗證網路連通性: ping、telnet host 3306、traceroute 確認無丟包、防火牆攔截。
  2. 檢查應用連線池: 連線池耗盡、驅動版本不符、未正確關閉連線、閒置超時設定不當。
  3. 排查認證失敗: 密碼錯誤、權限表異動、skip-name-resolve 導致 DNS 解析慢超時。
  4. 啟用錯誤日誌: log_error 記錄詳細拒連原因,精準定位。

最佳實踐建議

  • 生產環境設定 max_connect_errors = 100000 避免誤傷,並配合監控告警(如連線錯誤率 > 1% 即通知)。
  • 應用層實施指數退避重試、連線池預熱、優雅關閉,從源頭減少異常斷連。
  • 若確為網路抖動,考慮部署 ProxySQL 或 HAProxy 做連線多工與健康檢查,屏蔽後端不穩定。

結語

「Host is blocked」是 MySQL 的自我保護機制,而非 Bug。FLUSH HOSTS 能急救,調大 max_connect_errors 能緩解,但唯有修復網路與應用層連線品質,才能徹底杜絕。建議建立「連線錯誤率」核心指標納入日常巡檢,將風險消滅於萌芽狀態。

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