MySQL Host is blocked because of many connection errors 导致 JDBC 连接失败排查与解决

一、问题现象

XXL-Job 登录时报错:

复制代码
org.springframework.jdbc.CannotGetJdbcConnectionException:
Failed to obtain JDBC Connection

继续查看 XXL-Job 应用日志,发现底层异常:

复制代码
Caused by: com.mysql.cj.exceptions.CJException:
Host '10.0.0.10' is blocked because of many connection errors;
unblock with 'mysqladmin flush-hosts'

XXL-Job 是一个 Java 任务调度应用,xxl-job-admin 通过 JDBC 连接 MySQL。


二、问题原因

MySQL 参数:

复制代码
SHOW VARIABLES LIKE 'max_connect_errors';

默认通常为:

复制代码
max_connect_errors = 100

当某个来源 IP 连续发生较多连接异常,达到该阈值后,MySQL 会通过 Host Cache 临时封锁该 IP。

例如:

复制代码
Host '10.0.0.10' is blocked

这里封锁的是 来源 IP,不是某个数据库账号,也不是某一条 JDBC 连接。

该 IP 被封后,从这个 IP 发起的后续新连接都会受到影响。


三、排查过程

先排除最大连接数问题:

复制代码
SHOW VARIABLES LIKE 'max_connections';
SHOW GLOBAL STATUS LIKE 'Threads_connected';
SHOW GLOBAL STATUS LIKE 'Max_used_connections';
SHOW GLOBAL STATUS LIKE 'Connection_errors_max_connections';

如果当前连接很少、历史峰值也没有达到 max_connections,则说明不是连接数打满。

继续查看应用日志中的最底层:

复制代码
Caused by:

最终发现:

复制代码
Host '10.0.0.10' is blocked because of many connection errors

即可确认是 Host Block。


四、处理方法

建议先查看 Host Cache 留证:

复制代码
SELECT
    IP,
    SUM_CONNECT_ERRORS,
    COUNT_HOST_BLOCKED_ERRORS,
    COUNT_HANDSHAKE_ERRORS,
    COUNT_AUTHENTICATION_ERRORS
FROM performance_schema.host_cache;

然后解除封锁:

复制代码
TRUNCATE TABLE performance_schema.host_cache;

也可以使用:

复制代码
FLUSH HOSTS;

二选一即可,不需要重启 MySQL。


五、调整参数

为避免少量连接异常过快触发封锁,可以适当提高:

复制代码
SET GLOBAL max_connect_errors = 1000;

验证:

复制代码
SHOW VARIABLES LIKE 'max_connect_errors';

同时写入 /etc/my.cnf

复制代码
[mysqld]
max_connect_errors=1000

这样当前立即生效,并保证 MySQL 重启后仍然生效。


六、恢复验证

查看应用是否重新连接数据库:

复制代码
SELECT
    USER,
    HOST,
    DB,
    COMMAND
FROM information_schema.PROCESSLIST
WHERE DB='xxl_job';

然后重新访问 XXL-Job 页面验证。


七、注意事项

max_connectionsmax_connect_errors 不是一个概念:

参数 作用
max_connections MySQL 最大并发连接数
max_connect_errors 某来源 IP 连续连接异常的封锁阈值

本次故障真正相关的是:

复制代码
max_connect_errors

提高到 1000 只是降低再次被快速封锁的概率,真正根因还需要继续排查:

  • JDBC 连接池频繁重试

  • 网络短暂异常

  • MySQL 短暂不可用

  • 数据库账号或 Host 授权异常

  • JDBC 握手或 SSL 异常


八、快速排查 SOP

以后再次遇到:

复制代码
Failed to obtain JDBC Connection

直接按以下顺序:

复制代码
检查 MySQL 服务
    ↓
检查当前连接数
    ↓
排除 max_connections
    ↓
查看应用日志最底层 Caused by
    ↓
发现 Host is blocked
    ↓
查询 host_cache 留证
    ↓
清理 host_cache
    ↓
调整 max_connect_errors
    ↓
验证应用恢复

总结

本次问题本质是:

XXL-Job 连续出现 MySQL 连接异常,达到 max_connect_errors 阈值后,MySQL 封锁了来源 IP,导致后续新的 JDBC 连接被拒绝。

应急恢复:

复制代码
TRUNCATE TABLE performance_schema.host_cache;

优化:

复制代码
max_connect_errors=1000

最后记住一点:

遇到 Failed to obtain JDBC Connection,不要只看页面报错,要继续找最底层 Caused by

相关推荐
执念WRD2 小时前
Fastjson 1.2.83 RCE 漏洞利用
网络·安全·网络安全
xixiaoyunya2 小时前
局域网多电脑文件互备:从传统痛点到自动化方案的技术路径
网络·安全
snow@li2 小时前
CA证书是什么/数字证书/互联网上的电子身份证/Certificate Authority
运维
企鹅的蚂蚁3 小时前
LubanCat RK3588 实时 Linux 开发(九):从 U-Boot 到 initramfs 的串口启动故障分析
linux·rk3588·u-boot·串口调试·initramfs·linux启动
kkkkkkkkkk_Z3 小时前
学嵌入式和Linux应用编程|学习日记:UDP协议与Wireshark抓包学习笔记
linux·笔记·学习
Lynne3093 小时前
为什么工业数据越来越需要在现场处理?边缘计算正在解决什么问题?
网络·数据分析·数据
Allstar_433 小时前
全星研发项目管理APQP系统支持本地/私有云,开放API对接ERP/MES/PLM/OA,分级权限、版本追溯、ECN闭环,低代码配置,便于研发质量一体化扩展
运维
这个DBA有点耶3 小时前
数据库数据同步解决方案怎么选?6款主流工具横向对比与信创选型指南
数据库·架构·dba
嵌入式小能手3 小时前
飞凌嵌入式ElfBoard-Shell编程应用实例-提取字符并设置rtc时间
linux