【1】报错信息
message from server: "Host 'xx.xx.xx.xx' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'" 主机xx.xx.xx.xx被锁,因为许多连接错误;
【2】快速解决
mysql出现 mysqladmin flush-hosts,是因为
其他客户机连接错误次数过多时,mysql会禁止客户机连接
使用 mysqladmin flush-hosts 是清理host_cache表,它会记录连接客户端主机名、IP地址信息和其他连接信息,帮助诊断连接问题;(flush hosts;清除的是此表的数据)
解决方法:
mysql -u root -p 后台登陆mysql以后 执行 flush hosts; 或者通过设置较大的 max_connect_errors值 mysql> set global max_connect_errors=1000; 可以暂时解决问题
【3】深入分析
(3.1)根因分析
虽然报错解决了,但是过段时间以后,还会报以上错误;关于这个错误,其实就是因为同一IP在短时间内,产生了很多中断的数据连接(超过 MAX_CONNECT_ERRORS 最大值)二导致的
(3.2)performance_schema下的 hosts 表和 host_cache 表
host_cache表会记录连接客户端主机名、IP地址信息和其他连接信息,帮助诊断连接问题;(flush hosts;清除的是此表的数据)
如果要彻底解决此问题,请往下看
首先了解下MySQL performance_schema下的hosts表和host_cache。
mysql> use performance_schema; mysql> select * from host_cache\G; mysql> select * from hosts\G;
host_cache表会记录连接客户端主机名、IP地址信息和其他连接信息,帮助诊断连接问题;(flush hosts;清除的是此表的数据)
需要关注的两个列:
SUM_CONNECT_ERRORS:连接错误数
COUNT_HANDSHAKE_ERRORS:握手错误计数
hosts表中记录了连接客户端的HOST(主机名),以及CURRENT_CONNECTIONS(当前连接数),和TOTAL_CONNECTIONS(总连接数);
看到此处以后,你大概也清除了,其实也就是host_cache中SUM_CONNECT_ERRORS=MAX_CONNECT_ERRORS 时,再连接数据库时报的错;
#查看值 mysql> show variables like '%max_connect_errors%'; #设置值 mysql> set global max_connect_errors=3;
(3.3)SUM_CONNECT_ERRORS 参数的累加计数
那到底什么的错误,才会让SUM_CONNECT_ERRORS累加1呢?
1.首先排除网上说的密码错误,SUM_CONNECT_ERRORS累加1;
密码错误的话只会让COUNT_AUTHENTICATION_ERRORS累加1;
2.由于网络原因或其它一些连接错误会导致SUM_CONNECT_ERRORS累加1;
网络原因 Lost connection to MySQL server at 'XXX', system error: errno;
网络原因可以通过设置connect_timeout解决
#一般默认是10s mysql> mysql> show variables like 'connect_timeout'; mysql> set global connect_timeout=20;
其它原因,比如
也会导致SUM_CONNECT_ERRORS累加1;
我当时排除网络原因、并把所有我知道的数据库连接都关闭以后,还是发现SUM_CONNECT_ERRORS值在一直变大;
这时候可以通过mysql服务CONNECTION_CONTROL和CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS插件来查看监控情况;
(3.4)8.0版本使用连接插件观察
1.查看是否安装插件
mysql> show plugins;
2.如果没有的话,登录mysql执行
mysql>INSTALL PLUGIN CONNECTION_CONTROL SONAME 'connection_control.so';
mysql>INSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS SONAME 'connection_control.so';
3.插件安装成功后(如果只是为了排查问题,其它参数不要设置,如果有需求可以参考参考官网:https://dev.mysql.com/doc/refman/5.7/en/connection-control-installation.html)
-- 执行下面这个SQL,看是否有错误记录,错误记录会记录在information_schema.connection_control_failed_login_attempts表
select * from information_schema.connection_control_failed_login_attempts;
这时候可以看到用户主机,和失败的尝试;
我是通过这个,找到了一个主库,在用一个不用的用户,不停的在向从库发送请求;然后删除主从库关系,问题解决;SUM_CONNECT_ERRORS不在增大;
记录日常一次排错记录;