萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

解決 MySQL "Host is blocked" 連接錯誤:max_connect_errors 與 wait_timeout 調優

錯誤現象

ERROR 1129 (HY000): Host 'xxx' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'

含義:該主機短時間內連接錯誤次數超過 max_connect_errors 閾值(默認 100),被 MySQL 列入黑名單拒絕後續連接。

緊急解封:立即恢復連接

mysqladmin -u root -p flush-hosts

或登錄 MySQL 執行:

FLUSH HOSTS;

根因治理:調大容錯閾值

方法一:修改配置文件永久生效

# /etc/my.cnf 或 my.ini
[mysqld]
max_connect_errors = 100000  # 建議設大,如 10萬
wait_timeout = 30            # 空閒連接保持秒數,防積壓

修改後 必須重啟 MySQL 生效。

方法二:運行時動態調整(無需重啟)

mysql> SET GLOBAL max_connect_errors = 100000;
mysql> SET GLOBAL wait_timeout = 30;
動態修改僅對新連接生效,重啟後失效,務必同步更新配置文件。

深度排查:為什麼會頻繁連接錯誤?

調大閾值只是治標,**必須找出連接失敗根因**:

  1. 應用端連接池配置錯誤:驅動版本不匹配、JDBC URL 參數錯誤
  2. 認證失敗:密碼錯誤、權限不足、SSL/TLS 協商失敗
  3. 網絡抖動:防火牆間歇性阻斷、TCP RST 包
  4. 客戶端版本不兼容:如 8.0 客戶端連 5.7 服務端未指定 default-auth

排查工具

  • SHOW GLOBAL STATUS LIKE 'Aborted_connects'; 統計中斷連接數
  • SHOW GLOBAL STATUS LIKE 'Connection_errors%'; 細分錯誤類型
  • 啟用 log_error_verbosity=3 記錄詳細錯誤日誌
  • 抓包分析:tcpdump -i eth0 port 3306 -w mysql.pcap

wait_timeout 設置建議

場景建議值說明
Web 應用(連接池)30-60 秒配合連接池 idleTimeout 略小於此值
長連接批處理300-600 秒避免任務間隙被斷開
防止睡眠連接佔槽≤ 60 秒配合 interactive_timeout 區分交互/非交互

總結

max_connect_errors 調大 + flush-hosts 解封可快速恢復業務,**但核心在於排查並修復連接失敗根因**。建議建立連接錯誤監控告警(如 Aborted_connects 突增觸發告警),配合連接池最佳實踐,從架構層面消除此類故障。

copyright © 萬盛學電腦網 all rights reserved