客户端连接MySQL时出现 Host 'x.x.x.x' is blocked because of many connection errors,表示服务器在主机缓存中记录到该来源连续发生了过多次中断连接,并主动拒绝后续请求。这与账号密码错误、用户授权范围错误不是同一个判断。
先处理导致连接在握手阶段中断的网络或客户端问题,再解除阻断。 只清缓存会让业务暂时恢复,但错误继续累积后还会再次被封锁。

理解MySQL为什么会阻断主机
MySQL通过主机缓存跟踪客户端连接过程中的错误。max_connect_errors 决定允许同一主机连续中断连接的次数;只要在达到阈值前有一次连接成功,该主机的连续错误计数会清零。
在MySQL 8.4中,max_connect_errors 是全局、可动态修改的整数变量,默认值为100。服务器达到阈值后阻断来源,是为了避免持续异常请求消耗连接处理资源,也可能帮助限制某些攻击行为。
错误里的many connection errors主要指连接过程被中断,不等于用户连续输错100次密码。 需要从主机缓存的具体计数和服务端日志判断是哪一步失败。
从host_cache定位错误来源
使用具有相应查看权限的管理账号查询Performance Schema:
mysql -e "SELECT IP,HOST,HOST_VALIDATED,SUM_CONNECT_ERRORS,COUNT_HOST_BLOCKED_ERRORS,FIRST_ERROR_SEEN,LAST_ERROR_SEEN FROM performance_schema.host_cache ORDER BY SUM_CONNECT_ERRORS DESC;"
同时查看连接相关状态和当前配置:
mysql -e "SHOW GLOBAL VARIABLES LIKE 'max_connect_errors';"
mysql -e "SHOW GLOBAL STATUS LIKE 'Connection_errors_%';"
再按报错时间检查MySQL错误日志、客户端日志、负载均衡健康检查和防火墙记录。常见来源包括TCP连接被代理提前关闭、网络丢包、健康检查只建立连接却未完成协议握手、DNS正反向解析不稳定,以及连接池频繁创建后立即中断。
必须定位真实来源IP对应的应用或代理。 数据库看到的地址可能是NAT网关或代理,而不是最终业务主机。
修复网络、DNS和连接池根因
从被阻断主机测试到数据库端口的连通性,并检查路径是否稳定:
nc -vz DB_HOST 3306
getent hosts DB_HOST
ip route get DB_IP
如果经过云负载均衡或数据库代理,应采用厂商支持的MySQL健康检查方式,避免高频创建不完整连接。应用连接池要设置合理的建立超时、空闲回收与重试退避,不能在网络异常时无间隔并发重连。
MySQL主机缓存还会参与DNS查找。环境完全使用IP授权且不需要主机名解析时,可以评估 skip_name_resolve,但它会改变授权表中主机名匹配行为,启用前必须检查所有MySQL账户的Host列,不能在生产库上直接切换。
确认根因后解除主机阻断
MySQL官方文档列出多种清空主机缓存的方法。MySQL 8.4可以截断Performance Schema表:
mysql -e "TRUNCATE TABLE performance_schema.host_cache;"
这需要对该表拥有DROP权限。也可以由具备相应权限的管理员执行:
mysqladmin flush-hosts
清空操作会解除所有被阻断主机,而不只是单个IP,因此应先保存诊断信息并确认没有正在发生的扫描或故障风暴。不要把开放数据库公网端口或放宽防火墙作为解除阻断的步骤。
需要复现连接池行为时,可在 萤光云 建立隔离数据库环境;要从异地网络验证NAT与代理路径,也可用 LightNode 部署临时客户端。测试只使用临时账号和最小权限。
是否需要调高max_connect_errors
网络偶发抖动且业务连接量很高时,可以在根因修复后评估提高阈值:
mysql -e "SET GLOBAL max_connect_errors = 500;"
该修改只影响当前运行实例,重启后是否保留取决于配置方式。MySQL 8.0及8.4支持 SET PERSIST,但需要相应管理权限;也可以在经过变更管理后写入MySQL配置文件。MariaDB或托管数据库的持久化方式可能不同,应查看对应产品文档。
阈值越大,只是延后阻断,并不会修复网络故障。 MySQL官方也明确指出,如果存在TCP/IP问题,单纯增加 max_connect_errors 没有帮助。
解除阻断后的验收标准
解除前后分别记录主机缓存计数,随后从原客户端连续完成真实协议连接,而不只是测试端口:
mysql --connect-timeout=5 -h DB_HOST -u APP_USER -p -e "SELECT 1;"
观察一段符合业务峰值的时间,再次查询 performance_schema.host_cache 和 Connection_errors_%。如果来源经过代理,还应确认代理健康检查和后端连接复用均正常。
验收通过应满足应用连接恢复、连续错误计数不再快速增长、服务端没有重复阻断日志,并且数据库3306端口仍只对受信网络开放。
FAQ
重启MySQL能解除阻断吗?
重启可能清空内存中的主机缓存,但会造成额外停机,也不会修复导致连接中断的根因,不应作为首选方法。
这是不是账号被锁定了?
不是同一机制。Host is blocked针对连接来源主机,账号锁定和Access denied则要检查用户、密码、认证插件与授权范围。
能只解除一个IP吗?
官方常用操作是清空整个主机缓存。执行前应先保存诊断数据,并通过网络或代理策略阻止异常来源继续触发错误。
温馨提示
主机阻断是异常连接的结果,不是根因。先保存host_cache证据、修复网络或连接池,再执行一次受控清理;数据库端口和管理权限都不要为了图快而扩大。


