CentOS 7.9 + MySQL 5.7 主库,业务侧突然全部报 Host ‘10.0.7.15’ is blocked because of many connection errors,可登进去 show processlist 只有三十来个线程,离 max_connections 还远得很。
一开始怀疑是「中间负载均衡的空闲超时比数据库的 wait_timeout 短,连接先被中间设备断掉」,查了一圈,方向不对。
这类报错背后常见的原因有几处,逐个排除就行。客户端网络闪断,握手阶段失败的次数累计到 max_connect_errors 阈值,主机被直接拉黑。还有一种是连接池没做有效性检测,一直拿已经断掉的连接去用,失败次数被不断累加。
少数情况下是connect_timeout 设得太短,高负载时握手来不及完成也算一次错误。
先确认是不是被 blocked 而不是连接数打满
mysql -e 'show global status like "Aborted_connects"; show variables like "max_connect_errors";'
然后清掉主机错误计数,让连接立刻恢复
mysqladmin -uroot -p flush-hosts
随后把阈值和握手超时调到合理值
mysql -e 'set global max_connect_errors=100000; set global connect_timeout=20;'
从错误日志确认失败集中在握手还是认证
tail -200 /var/log/mysql/error.log | grep -i 'aborted\|handshake'
改完先别撤,确认这几项。业务侧连接恢复且不再出现 blocked 报错,Aborted_connects 计数不再增长,错误日志里没有新的握手失败记录。
flush-hosts 只是把计数清零,网络那一段不修还会再来;连接池要开保活检测,别把失效连接一直往外发。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
