mysql wait_timeout=_【MySQL运维】wait_timeout与interactive_timeout

一、两者的区别

· interactive_timeout:交互模式下会话超时时间,单位为秒

· wait_timeout:应用会话连接超时时间,单位为秒,默认为8小时。应用程序在连接成功后如果没有后续操作,则连接处于Sleep空闲状态。执行show processlist命令时Command 列显示为Sleep就表示该客户端为空闲连接。如果空闲时长达到wait_timeout的限制则断开该连接。客户端再次发送请求的话就会收到Lost connection to MySQL server during query的错误提示。如果需要继续操作就需要重新建立连接再执行请求。这会带来额外的开销。

二、超时时间的设置

1、全局永久生效参数设置,需重启服务

vi my.cnf

[mysqld]

interactive_timeout=3600

wait_timeout=3600

2、全局临时生效参数设置,无需重启

set global interactive_timeout 3600

set global wait_timeout 3600

show global variables like '%timeout%' #查看设置生效

通常1、2两个方法一起设置,保证当前服务和重启服务后设置都能正常生效

三、超时时间带来的连接暴涨问题与处理

在线上配置中该值需要根据实际环境进行调整,如果设置太大会导致连接长时间不释放,而太短的话又会因为频繁断开请求影响工作。两者都存在连接数暴涨达到MySQL max_connections限制而产生Too many connections的错误,甚至可能OOM。当出现这种问题的时候除了调大max_connections的值(大量连接进来后系统负载也会变大)以外,还可以通过人工释放连接来解决。

1、运行show processlist查看当前连接情况

fbf84dc4dcc6b497f56807d2d84ef1aa.png

2、上图中有2个事务处于sleep状态,id分别是4和5。通过information_schema库的innodb_trx表进行进一步查看,定位出哪些长连接是真正处于空闲,这样可以避免错误的终止掉一些长事务。

9102cee06ff39c961f7937b2db150181.png

3、上图中trx_mysql_thread_id=4表示id=4 的线程还处在事务中。因此需要优先断开的是其它ID的事务。如果这样还不够再考虑断开事务内空闲太久的连接。如果一个客户端处于sleep状态被服务端主动断开,这个客户端需要发起下一个请求的时候才会收到ERROR 2013 (HY000): Lost connection to MySQL server during query的报错。从数据库端主动断开连接可能是有损的,有的应用收到这个错误后不重新连接,而是直接用这个已经不能用的句柄进行重试,导致从应用端看上去MySQL存在问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值