ERROR 1129 (HY000) unblock with 'mysqladmin flush-hosts'
一、错误解释
ERROR 1129 (HY000): Host 'x.x.x.x' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'
该IP有过多的错误连接,被mysql被阻止继续连接了。
二、错误原因 (Only)
本质原因是因为同一个IP在短时间内产生太多中断的数据库错误连接(超过max_connect_errors的最大值)而导致的。
三、产生原因
1、服务配置错误:
连接MySQL失败之后不断的重连,致使错误连接数飙升,超过最大值,使得同服务器的其他服务不能再继续连接MySQL。
2、网络超时:
MySQL客户端与数据库建立连接需要发起三次握手协议,正常情况下,这个时间非常短,但是一旦网络异常,网络超时等因素出现,就会导致这个握手协议无法完成,MySQL有个参数connect_timeout,它是MySQL服务端进程mysqld等待连接建立完成的时间,单位为秒。如果超过connect_timeout时间范围内,仍然无法完成协议握手话,MySQL客户端会收到异常致使错误连接增加。
3、其他原因:
脚本或者Shell命令在不断的使用错误的MySQL用户名和密码连接MySQL。
四、解决办法
1、修改 max_connect_errors 的值
mysql> use performance_schema; mysql> show variables like 'max_connect_errors'; mysql> set global max_connect_errors = 10000;
2、检查网络超时
ping 一下服务所在环境和mysql数据库之间的网络,如果延时大于10s基本没救,建议重启服务器(如果服务是部署在docker里面的还建议重启docker)。
mysql内查看错误连接数量:
mysql> use performance_schema; mysql> select * from host_cache\G
如果 COUNT_HANDSHAKE_ERRORS 数量 大于 SUM_CONNECT_ERRORS 那么大概可以确定就是网络问题。
3、根本解决办法
解决ERROR 1129 (HY000)的方法是执行flush host或者 mysqladmin flush-hosts,其目的是为了清空host cache里的信息,那是不是说不使用host cache就可以了?使host cache不生效(禁用 MySQL DNS 查找)的方式有如下两种:
A、设置 host_cache_size 为0
mysql> set global host_cache_size=0;
B、配置skip-name-resolve
编辑mysql配置文件 my.cnf
vi /etc/my.cnf
在 [mysqld] 下面添加 下面这一行
skip-name-resolve