MySql连接空闲8小时自动断开引起的问题

一、问题描述

? 最近遇到了一个奇怪的MySql数据库问题,好几次前一天晚上历史数据还正常存储,第二天早上来了看实时数据存储还正常,历史数据不存储了。找了好久也没找到问题。后来仔细想了想,历史数据设置了变化才存储,是不是数据一直不变,就一直没有往数据库写数据,导致MySql的连接太久不用自动断开了。然后就百度了一下,Mysql空闲连接有效时长,一看都说是8个小时就自动断开了。嗯,有点感觉了,应该就是这个原因。

二、问题排查

根据查到的资料查看MySql 有两个参数,可以设定空闲连接的有效时长,分别是interactive_timeoutwait_timeout ,可以在mysql配置文件中设置。根据这一点,可以来进行排查了。

  1. 使用show variables like ‘%timeout%‘;命令查询以上两个参数的值,一查都是28800(单位是秒,刚好8小时)。
  2. 在mysql配置文件中修改interactive_timeoutwait_timeout都为100,这样连接100秒不使用就自动关闭了。
  3. 重启mysql服务,开始向数据库中插入数据,中间暂停3分钟(确保空闲连接已经断开),可以使用show status like ‘Threads%‘命令来查看当前的连接数,查询结果中Threads_connected即为当前连接数。
  4. 继续向mysql插入数据,一看数据果然没有存储上,问题成功复现并找到原因。

三、解决问题

  1. 查看数据存储部分代码,发现代码中有做断开重连,但是判断连接是否有效的部分写的有问题,也没有校验mysql_query的返回值,所以数据存储失败的时候没有产生日志。
  2. 修改代码,连接断开后自动重连,校验mysql_query的返回值并产生日志,使每次数据库操作结果都有记录。注意:mysql c/c++ API mysql_query返回 0为操作成功,非0为操作失败。

四、一点反思

? 这个问题完全是由于代码写的不严谨造成的,如果代码写的严谨,该校验的地方都加上校验,就算出现问题也能快速定位。吃一堑,长一智以后需要多注意,养成良好的代码习惯。还有就是需要找时间系统的学习一下数据库方面的内容,项目锻炼是能够快速学习一些内容,但是都是用到哪部分学哪部分,不系统。还是需要自己多花时间系统的学。

原文地址:https://www.cnblogs.com/ay-a/p/10520425.html

时间: 2024-07-29 08:55:51

MySql连接空闲8小时自动断开引起的问题的相关文章

Mac下ssh连接远程服务器时自动断开问题

在mac下使用securecrt通过ssh连接远程服务器时,总会一段时间没有动作后,ssh被自动断开.在windows下用xmanager貌似没有遇到过这个问题. 在网上找了解决方法如下: 客户端配置: Global.ini文件中将D:"Disconnect After Resume Timeout"=00000000改为D:"Disconnect After Resume Timeout"=FFFFFFFF securecrt界面上配置:send string \

配置phpmyadmin使登录时可填写IP管理多台MySQL 连接多个数据库 自动登录

一.如何设置phpMyAdmin自动登录? 首先在根目录找到config.sample.inc.php复制一份文件名改为config.inc.php(如果已经存在 config.inc.php 文件,则直接修改该文件即可).打开config.inc.php 找到 $cfg['Servers'][$i]['auth_type'],将 复制代码 代码如下: $cfg['Servers'][$i]['auth_type'] = 'cookie'; 改成 复制代码 代码如下: $cfg['Servers

如何避免SSH Secure Shell Client连接Linux超时,自动断开?

一般修改两个地方可将这烦人的问题解决 1.echo $TMOUT 如果显示空白,表示没有设置, 等于使用默认值0, 一般情况下应该是不超时. 如果大于0, 可以在如/etc/profile之类文件中设置它为0. 2.修改/etc/ssh/sshd_config文件,将 ClientAliveInterval 0和ClientAliveCountMax 3的注释符号去掉,将ClientAliveInterval对应的0改成60,ClientAliveInterval指定了服务器端向客户端请求消息

MySql连接异常解决

这两天遇到一个mysql连接的问题,找人弄了好几天也没弄好,先看一下报错信息: ==================================================================== org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.h

linux下解决mysql 连接超时问题,永久生效

1,mysql 默认空闲8小时后,就会断开数据库连接,要解决这个问题,就要加长时间 2,修改mysql配置文件 /etc/mysql/my.cnf ,记得修改之前要备份 添加如下内容,如果有则修改,时间以秒为单位 [mysqld] wait_timeout=31536000 interactive_timeout=31536000 3,执行mysql restart 重启mysql 4,查看修改是否生效 show variables like '%timeout'; 5,好了到此结束,以后再也不

python下保持mysql连接,避免“MySQL server has gone away“方法

因需要对saltstack的所有动作进行入库采集,网上采集脚本mysql连接会因超时而断开,导致守护进程在下一次采集数据时提示: Traceback (most recent call last):   File "./salt_event_to_mysql.py", line 39, in <module>     ret['success'], json.dumps(ret)))   File "build/bdist.linux-x86_64/egg/MyS

mysql连接的空闲时间超过8小时后 MySQL自动断开该连接解决方案 详细出处参考:http://www.jb51.net/article/32284.htm

MySQL 的默认设置下,当一个连接的空闲时间超过8小时后,MySQL 就会断开该连接,而 c3p0 连接池则以为该被断开的连接依然有效.在这种情况下,如果客户端代码向 c3p0 连接池请求连接的话,连接池就会把已经失效的连接返回给客户端,客户端在使用该失效连接的时候即抛出异常 解决这个问题的办法有三种: 1. 增加 MySQL 的 wait_timeout 属性的值. 修改 /etc/mysql/my.cnf文件,在 [mysqld] 节中设置: # Set a connection to w

mysql解决自动断开8小时未曾用过的链接

今天有运维的同事反映,发布关键词不太稳定,点了没反应.就去线上看了一下日志,发现数据库没有链接,就查了一下问题 关于mysql自动断开的问题研究结果如下,在mysql中有相关参数设定,当数据库连接空闲一定时间后,服务器就 会断开等待超时的连接: 同一时间,这两个参数只有一个起作用.到底是哪个参数起作用,和用户连接时指定的连接参数相关,缺省情况下是使用 wait_timeout.我建议是将这两个参数都修改,以免引起不必要的麻烦. 2.修改参数 这两个参数的默认值是8小时.我测试过将这两个参数改为0

【转】MySQL连接超时断开的问题

这遍文章转过来做个笔记,时不时看看. 转:http://blog.csdn.net/nethibernate/article/details/6658855 Exception如下: [html] view plaincopy org.hibernate.util.JDBCExceptionReporter - SQL Error:0, SQLState: 08S01 org.hibernate.util.JDBCExceptionReporter - The last packet succe