美文网首页
mysql报错 message from server: "Ho

mysql报错 message from server: "Ho

作者: 饱饱想要的灵感 | 来源:发表于2024-09-29 16:28 被阅读0次

一、报错信息

2024-09-30 11:15:11 work [Druid-ConnectionPool-Create-586009238] ERROR com.alibaba.druid.pool.DruidDataSource - create con
nection SQLException, url: jdbc:mysql://127.0.0.1:3306/popo?characterEncoding=utf8&useSSL=false&zeroDateTimeBehavio
r=convertToNull&tinyInt1isBit=false&serverTimezone=Asia/Shanghai, errorCode 1129, state HY000 
java.sql.SQLException: null,  message from server: "Host '127.0.0.1' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'"
 at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
 at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
 at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:833)
 at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:453)
 at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246)
 at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198)
 at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1644)
 at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1710)
 at com.alibaba.druid.pool.DruidDataSource$CreateConnectionThread.run(DruidDataSource.java:2753)
2024-09-30 11:15:12 work [Druid-ConnectionPool-Create-586009238] ERROR com.alibaba.druid.pool.DruidDataSource - create con
nection SQLException, url: jdbc:mysql://127.0.0.1:3306/popo?characterEncoding=utf8&useSSL=false&zeroDateTimeBehavio
r=convertToNull&tinyInt1isBit=false&serverTimezone=Asia/Shanghai, errorCode 1129, state HY000 
java.sql.SQLException: null,  message from server: "Host '127.0.0.1' is blocked because of many connection errors; unbloc
k with 'mysqladmin flush-hosts'"
 at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
 at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
 at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:833)
 at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:453)
 at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246)
 at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198)
 at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1644)
 at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1710)
 at com.alibaba.druid.pool.DruidDataSource$CreateConnectionThread.run(DruidDataSource.java:2753)

如果不求原因

可以通过mysql -u root -p 后台登陆mysql以后 执行 flush hosts;
或者通过设置一个更大的 max_connect_errors值都可以暂时解决问题

mysql> show variables like 'max_connect_errors';
mysql> set global max_connect_errors=1000;

虽然报错解决了,但是过段时间以后,还会报以上错误; 关于这个错误,其实是因为同一IP在短时间内,产生了很多中断的数据库连接, 次数超过 MAX_CONNECT_ERRORS(即错误连接最大值)导致的

二、hosts和host_cache表

如果要彻底解决此问题, 首先要了解MySQL performance_schema库下的hosts和host_cache表,

mysql> select * from performance_schema.host_cache\G
mysql> select * from performance_schema.hosts\G

host_cache表会记录连接客户端主机名、IP地址信息和其他连接信息,帮助诊断连接问题;(flush hosts就是清除的是此表的数据) 需要重点关注的有两个列: SUM_CONNECT_ERRORS(连接错误数)COUNT_HANDSHAKE_ERRORS(握手错误计数)

mysql错误连接数.png

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;

三、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;
  1. 其它一些连接错误,例如插件连接错误也会导致SUM_CONNECT_ERRORS累加1;

四、解决问题

我当时排除网络原因、并把所有我知道的数据库连接都关闭以后,还是发现SUM_CONNECT_ERRORS值在一直在增加;

这时候可以通过mysql的CONNECTION_CONTROL和CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS插件来查看监控情况;

  1. 查看是否安装插件
mysql> show plugins;
mysql错误连接监控插件.png
  1. 安装插件,登录mysql -uroot -p执行命令
mysql>INSTALL PLUGIN CONNECTION_CONTROL SONAME 'connection_control.so';
mysql>INSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS SONAME 'connection_control.so';

插件安装成功后(如果只是为了排查问题,其它参数不要设置,如果有需求可以参考参考官网

  1. 查看错误记录,错误记录会记录在information_schema.connection_control_failed_login_attempts表
 select * from information_schema.connection_control_failed_login_attempts;

这时候可以看到用户主机,和失败的尝试:


mysql空用户连接.png

通过这个,可以找到发起错误连接的源头,解决问题;SUM_CONNECT_ERRORS也不再增加。

相关文章

网友评论

      本文标题:mysql报错 message from server: "Ho

      本文链接:https://www.haomeiwen.com/subject/apldrjtx.html