某台服务器项目连接不上mysql
java.sql.SQLException: null, message from server: "Host 'xxx.xx.xx.xxx' 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.SQLError.createSQLException(SQLError.java:97)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:836)
at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:456)
at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246)
at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:199)
at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138)
at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:353)
at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201)
at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:473)
at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:562)
at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115)
at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112)
at com.zaxxer.hikari.HikariDataSource$$FastClassBySpringCGLIB$$eeb1ae86.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
问题原因:将如上错误搜索后会出现很多答案,大体上是说因为请求mysql连接错误过多,导致mysql拒绝来自该服务器ip的连接,多数解决方案如下:
1)修改mysql的最大连接错误数(max_connect_errors)
# 查看某ip地址链接mysql的总连接错误数
mysql> select SUM_CONNECT_ERRORS as count from performance_schema.host_cache where ip='xxx.xx.xx.xx';
+-------+
| count |
+-------+
| 116 |
+-------+
1 row in set (0.00 sec)
# 通过修改my.cnf文件将max_connect_errors连接数设置为1000(默认是100)
mysql> show variables like 'max_connect_errors';
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| max_connect_errors | 1000 |
+--------------------+-------+
1 row in set (0.01 sec)
2)重新刷新mysql的host权限
使用命令刷新
[root@yumaster ~]# /usr/bin/mysqladmin flush-hosts -h ${mysqlIp} -uroot -p
# 不知道位置可通过whereis查看
[root@yumaster ~]# whereis mysqladmin
mysqladmin: /usr/bin/mysqladmin /usr/share/man/man1/mysqladmin.1.gz
或者使用mysql命令刷新
mysql> flush hosts;
或者重新给root用户授权
mysql -u root -p
mysql>use mysql;
mysql>select 'host' from user where user='root';
mysql>update user set host = '%' where user ='root';
mysql>flush privileges;
mysql>select 'host' from user where user='root';
以上一顿操作,结果还是躲不过0-5的结局。
解决方法:作者使用docker部署的后端服务,因为物理机故障问题导致虚拟机宕机,当虚拟机重启后发现但凡与mysql关联的项目都起不来,报了以上错误,错误在解决方法中也是让刷新hosts。
java.sql.SQLException: null, message from server: "Host 'xxx.xx.xx.xxx' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'"
但是并非如此,作者试用了以上几种方法都不管用,又通过仔细看日志发现日志的打印时间是2018年(当前2020年),
2018-07-26 23:55:10 WARN AIoT-TX-Manager main org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator HHH000342: Could not obtain
2018-07-26 23:55:10 WARN AIoT-TX-Manager main org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext
2018-07-26 23:55:10 INFO AIoT-TX-Manager main org.apache.catalina.core.StandardService Stopping service [Tomcat]
随即怀疑是因为两台服务器时间不一致导致项目连接mysql失败。
# mysql服务器时间
[root@localhost ~]# date
2020年 10月 27日 星期二 18:53:17 CST
# 项目部署服务器时间
[root@localhost ~]# date
The Jul 26 23:53:17 CST 2018
修改项目服务器时区与校准为当前时间,问题完美解决。
#删除当前默认时区的配置文件,不建议直接删除(出于操作安全考虑),最好是使用mv命令重命名
mv /etc/localtime /etc/localtime.bak
#建立软连接文件到配置文件区,替换掉之前删掉或备份的/etc/localtime 文件
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
#查看当前时区
timedatectl
#设置当前时区为上海,因为mysql服务器时区也是用的上海
timedatectl set-timezone Asia/Shanghai
#安装时间同步应用
yum install -y ntp
#同步上海授时中心时间
ntpdate ntp.api.bz
#再次查看时间
date
#打开定时任务编辑器,设置每天晚上23:59同步时间(也可不设置)
crontab -e
59 23 * * * ntpdate ntp.api.bz