【MySQL运维】wait_timeout与interactive_timeout

Tanglu MySQL 2020-02-09 6368 0

一、两者的区别

· 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 查看当前连接情况

timeout1.jpg


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

timeout2.jpg


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

评论