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

解決 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 內部計數器記錄每個客戶端 IP 的**連線錯誤次數** (非認證失敗,含 TCP 握手失敗、SSL 錯誤、握手超時、max_allowed_packet 超限等)。
  • 預設閾值 max_connect_errors = 100 (5.6 之前為 10)。達標後該 IP 被加入封鎖列表,後續連線直接拒絕。
  • 封鎖資訊存於記憶體 host_cache,**重啟 MySQL 或執行 FLUSH HOSTS 即清空**。

立即解封

# 命令列
mysqladmin -u root -p flush-hosts

# SQL
FLUSH HOSTS;

根因排查 (解封只是暫時,必須找出錯誤來源)

調整閾值 (治標不治本,慎用)

-- 動態調整 (重啟失效)
SET GLOBAL max_connect_errors = 10000;

-- 永久 (my.cnf)
[mysqld]
max_connect_errors = 10000

**警告**:單純調大閾值掩蓋網路或應用問題,可能導致真實攻擊流量未被封鎖。建議保持預設或略增 (1000),重點解決根因。

監控 host_cache (5.6+ / 5.7+)

-- 查看封鎖狀態
SELECT HOST, SUM(COUNT_*) AS total_connections, 
       SUM(COUNT_*_ERROR) AS error_count, 
       MAX(LAST_ERROR_TIMESTAMP) AS last_error
FROM performance_schema.host_cache
GROUP BY HOST
HAVING error_count > 10
ORDER BY error_count DESC;

最佳實踐清單

  1. 應用端:連線池預熱、閒置連線驗證 (testOnBorrow/validationQuery)、指數退避重試。
  2. 資料庫端:max_connect_errors=1000、啟用 skip_name_resolve=ON 避免 DNS 延遲導致握手超時。
  3. 網路端:安全群組/防火牆僅放行應用伺服器 IP 段、啟用 TCP keepalive。
  4. 告警:host_cache error_count > 50 觸發告警,自動封禁來源 IP (fail2ban/Cloudflare WAF)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
常見原因排查指令/日誌解決方向
應用連線池洩漏/未正確關閉應用日誌、SHOW PROCESSLIST 大量 Sleep修復連線池配置、啟用 validate_connection
網路不穩/防火牆間歇性丟包ping -c 100、mtr、tcpdump網路層面修復、調整 TCP keepalive
客戶端版本不匹配 (SSL/認證協議)錯誤日誌 SSL connection error統一驅動版本、配置 tls_version
惡意掃描/暴力破解SELECT * FROM performance_schema.host_cache 看 ERROR_COUNT防火牆封禁、fail2ban、修改預設埠
max_allowed_packet 過小導致大封包斷開錯誤日誌 Packet too large調大 max_allowed_packet (如 64M)