记录一次排查docker中mysql一会儿可以连接上一会儿会话断开问题,服务硬盘损坏,导致docker中mysql没100s自启动一次出现的问题

1、起因

项目现场服务器宕机后,上面的docker容器启动后,突然有一个应用的服务端,总是突然报错,说数据库连接不上,但是通过navicat外面又可以连接。

Caused by: org.apache.tomcat.jdbc.pool.PoolExhaustedException: [http-nio-7006-exec-9] Timeout: Pool empty. Unable to fetch a connection in 10 seconds, none available[size:30; busy:30; idle:0; lastwait:10000].
	at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:707)
	at org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java:198)
	at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:132)
	at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111)
	at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77)
	... 90 common frames omitted

2、排查过程

1、把错误的sql拿到navicat上面执行,发现,这些都是需要执行时间比较长的sql,执行到一半,navicat也是提示会话被关闭

2、通过navicat的“服务器监控“工具查看目前该mysql正在运行的进程情况,发现一个奇怪的现象,mysql差不多每100秒左右,所有的进程都会被kill掉,然后过一会再有新的进程进来

3、本来以为是mysql设置了什么需要限制查询的最大执行时间(这边是mysql5.7.3)所以查询了

  • wait_timeout:控制非交互连接的超时时间。
  • interactive_timeout:控制交互式连接的超时时间。
  • 默认值通常为 28800 秒(8 小时)
SHOW VARIABLES LIKE 'wait_timeout';
SHOW VARIABLES LIKE 'interactive_timeout';

通过查询数据库两个默认值都是默认的8小时,所以排除这个问题

4、通过查看mysql的日志

docker logs -f my_mysql_container

发现日志,每隔100秒就会shutdown,然后再启动

 [ERROR] InnoDB: Error in system call pread(). The operating system error number is 5.
InnoDB: Operating system error number 5 in a file operation.
InnoDB: Error number 5 means 'Input/output error'.
InnoDB: Some operating system error numbers are described at...

5、通过上述错误描述,发现应该是硬盘换块导致

我们的错误和这个一样

MySQL Bugs: #96776: The database crashes and restarts automatically.Then keep this status..

[root@$ ~]# badblocks -s -v /dev/sdb1 
正在检查从 0 到 1953513471的块  
Checking for bad blocks (read-only test): 968188800one, 3:22:11 elapsed
968188836one, 3:23:15 elapsed
968188837one, 3:23:36 elapsed
968188838one, 3:23:57 elapsed
968188839one, 3:24:19 elapsed
969017368one, 3:24:53 elapsed
969017424one, 3:25:36 elapsed
969017425one, 3:25:57 elapsed
969017426one, 3:26:19 elapsed
969017427one, 3:26:40 elapsed
完成
Pass completed, 10 bad blocks found.  

3、解决问题

1、如果之前有备份,让硬件处理好坏块后,重新部署容器,初始化mysql (我们这次是这种情况)

2、如果没有备份记得先备份下你mysql的数据文件,在重新安装一个数据库,把你数据库文件拷贝进去看是否可以恢复(之前有处理过这种情况的,就是mysql启动不起来,把数据库库文件拷贝出来以后进行恢复)类似下面的处理方法

MySQL数据库通过data文件夹恢复数据库信息_数据库date文件还原-CSDN博客

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值