一次关于MySQL max_connect_errors报错的排查记录
现象
数据同步服务未正常工作,查看docker日志docker logs --tail 100
输出报错信息1
Mysql2::Error: Host '10.xx.x.xxx' is blocked because of many connection errors;
分析为应用服务器多次连接数据库服务器失败,导致应用服务器ip被ban
临时解决方案
登录MySQL,使用flush hosts
命令重置host的报错记录
修改max_connect_errors
参数,设置一个较大值1
2show variables like 'max_connect_errors';
set global max_connect_errors = 1000;
重启应用服务后即可恢复
问题分析
参考文章https://www.cnblogs.com/kerrycode/p/8405862.html说明
MySQL会在performance_schema数据库下的host_cache表中记录客户端的访问情况,包括连接失败和密码登录失败等1
2use performance_schema;
select * from host_cache where ip='10.xx.x.xxx' \G;
1 | Connection id: 390771 |
其中SUM_CONNECT_ERRORS
的值超过max_connect_errors
值时,则会导致文章开头报错
根据文章测试
登录时输入密码错误并不会导致ERRORS次数增加
而尝试TCP连接且连接最终未成功时,则会导致ERRORS增加
问题修复
服务器近期有启用端口扫描脚本,该脚本通过nc
命令每隔10秒访问目标ip:端口以判断连通性
经验证该命令作用在MySQL对外服务端口上时,会导致SUM_CONNECT_ERRORS
增加
其扫描原理是通过建立TCP连接来判断连通性,因此可增加参数-u
建立UDP连接避免
或扫描22 ssh服务端口替代3306 MySQL服务端口即可解决问题