美文网首页
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