mysql 出现 mysqladmin flush-hosts

【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不在增大;
记录日常一次排错记录;

【参考文档】

本文转自:https://www.jianshu.com/p/3a397a358a22
posted @ 2023-07-12 10:24  郭大侠1  阅读(4795)  评论(0编辑  收藏  举报