【问题解决】java.sql.SQLException: null, message from server: “Host ‘xxx.xx.xx.xxx‘ is blocked because of

某台服务器项目连接不上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 
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小猿备忘录

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值