zoukankan      html  css  js  c++  java
  • 数据库炸了----我就重启了一下啊(Communications link failure)

    重启数据库后,数据库大部分时间连不上了;连续请求不会报错,请求间隔时间稍微长一点就会报错
    报错如图:

    com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

    The last packet successfully received from the server was 7,008 milliseconds ago. The last packet sent successfully to the server was 0 milliseconds ago.
    这里的意思是 7,008毫秒前创建的连接,现在不可用了。有的报错这个时间是很大的。

    上网查资料(也问了老大,老大一看报错,说这样改最快,我追问了一下,老大说了下全局变量和会话变量的作用范围,和我后面找到的答案一样):

    test-on-borrow: true #申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
    test-on-return: true #归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。

    把这两个配置配上就能解决问题!!!但是,本来为了性能,这两个配置默认是false。问题的关键可能不在这,我就重启了一下mysql,本来是好好的,就是重启出了问题的。

    继续查原因


    1,查看mysql系统配置参数:

    show  VARIABLES like '%timeout%'
    发现wait_timeout和interactive_timeout都是28800,8小时;并无异常
    wait_timeout:针对非交互式连接,通过jdbc连接数据库是非交互式连接
    interactive_timeout:针对交互式连接,通过mysql客户端连接数据库是交互式连接

    2,查看mysql连接情况:

    show processlist;   只展示100个连接

    show full processlist;    展示所有连接

    查看连接54个,还行,无异常

     

    3,继续上网查资料:
    于是忽找到了这篇文章:https://baijiahao.baidu.com/s?id=1642208511147231446&wfr=spider&for=pc
    4,查看show status

    Abort_clients表示客户端没有正确的关闭连接,而被终止的连接数,引起的原因:

    a.客户端程序退出之前未调用mysql_close()来关闭mysql连接

    b.客户端的休眠时间超过了mysql系统变量waittimeout和interactivetimeout的值,导致连接被mysql进程终止

    c.客户端程序在数据传输过程中突然结束

    有10万连接被异常中断!!!


    5,查看mysql全局变量:
    这里一个容易把人搞蒙的地方是如果查询时使用的是show variables的话,会发现没什么问题,这是因为单纯使用show variables的话就等同于使用的是show session variables,查询的是会话变量,只有使用show global variables,查询的才是全局变量。
    上面看到两个超时时间都一样,是因为查的是当前会话的连接 的超时时间,当然是interactivetimeout和waittimeout一样,都是8小时,所以没发现问题。【一定要搞清楚每个命令的真实含义,不然只能抓耳挠腮了】

    查看全局配置:
    show GLOBAL VARIABLES like '%timeout%'
    果然,wait_timeout 是5秒,5秒后mysql连接就会断开导致报错。


    再去看了下配置文件:石锤了,配置文件中的wait_timeout 被人修改成了5秒。

    interactive_timeout/wait_timeout:交互式和非交互式链接的超时设置,防止客户端长时间链接数据库,什么都不做处于sleep状态,强制关闭长时间的sleep链接。默认情况先两值的都为28800(8h)


    6,真相大白:
    wait_timeout被设置成了5秒,所以,所有的连接5秒后会被自动关闭,再次使用这个过期的连接就会报错
    其中wait_timeout就是负责超时控制的变量,其时间默认长度为28800s,就是8个小时,那么就是说MySQL的服务会在操作间隔8小时后断开,需要再次重连;不知道是谁把他设置成了5秒。重启之后导致数据库连不上,一直报错。

    那有人要问了,为什么重启了,出现了问题,原来怎么好好的?
    这是一个好问题,我开始也百思不得其解,后来终于弄清楚了:
    这是因为mysql的全局配置被修改了,重启mysql前这个配置生效的值并不是5秒。
    使用 set global wait_timeout=28800就可以修改mysql全局变量。修改完后就不会再报错了。



    不过这样修改不会一劳永逸,如果再次重启mysql,就会重新出现上面的问题。

    整个过程应该是这样:第一次安装完mysql后,有人修改了配置文件中的wait_timeout参数为5秒,之后,这个参数又被修改了,这次是用命令set global wait_timeout=xxx,设置这个参数的全局配置为xxx秒(默认是8小时),一直稳定运行到现在。然后我重启了mysql,wait_timeout这个配置就恢复成了5秒,问题出现。

     7、后记:
    这是一个mysql的基础问题。基础太差导致排查问题用了很长时间。但凡一个科班出身都知道这个。

    mysql 版本:5.6.44
    试了下5.7.25-log查看命令结果就不一样了

  • 相关阅读:
    数字形式转换
    货币转换
    温度转换
    volatile 的可见性,禁止指令重排序,无法保证原子性的理解
    mysql索引的结构的分析
    史上最详细的ORACLE19c安装说明
    Solaris 修改联网代理的设置
    Oracle Drop表并未直接删除 drop table xx purge
    oracle自定义函数创建函数索引
    连线法合并两个有序链表
  • 原文地址:https://www.cnblogs.com/hbuuid/p/14069363.html
Copyright © 2011-2022 走看看