当前位置:C++技术网 > 资讯 > Mysql连接数居高不下解决办法

Mysql连接数居高不下解决办法

更新时间:2019-03-21 17:55:16浏览次数:1+次

    最近系统总是出现数据库巨卡的问题,最后发现是有很多Sleep的连接。查看的办法是在执行SQL的地方执行:

show processlist
    这样就可以看到mysql的进程列表,也就是各个连接的进程。这些Sleep的进程怎么来的呢?
    造成Sleep的原因有三个:
1.客户端程序在退出之前没有调用mysql_close().
2.客户端sleep的时间在wait_timeout或interactive_timeout规定的秒内没有发出任何请求到服务器. 
3.客户端程序在结束之前向服务器发送了请求还没得到返回结果就结束掉了。
    简单理解就是,客户端断开了数据库的连接,但是没有通知mysql。而mysql默认的连接超时时间还没有到,所以这些连接就都要进入Sleep状态。因为既没有到超时时间,又没有活跃,所以先让其休眠,减少系统开销。如果客户端开始活跃了,这个连接会恢复,如果不活跃,则在超时时间到了之后就会择机干掉这些进程。
    为什么说是择机干掉呢?因为mysql并不是非常密集的去检测这些Sleep的超时时间的,而是有一个间隔的,而且有自己的策略。所以有时候尽管你设置的超时时间到了,有些进程依然在Sleep而没有被干掉。不过不用担心,不会等的太久,mysql会安排到位的。
    原因1和3需要我们检查客户端的代码,确保用完后断开连接。如果是故意保持连接,需要注意超时时间过后,要重连。而如果是不想主动断开连接或者修改程序有点麻烦,那么可以将超时时间修改一下,调小一些。需要注意的是,调小后,程序在被mysql断开连接后要记得重连,这一点很重要哦!
    要永久生效,请修改my.cnf文件,在此文件中添加:
wait_timeout = 60
    这里的时间的单位是秒。需要提醒的是,此配置要添加在[mysqld]下而不是在[mysqld_safe]下哦。
    修改后重启mysql服务才能生效。重启的命令:
service mysqld restart
    修改之后,即使客户端没有主动断开而直接关闭,60秒后这些无效的连接也会被自动干掉,以免使数据库变得缓慢。