浅析interactive_timeout和wait_timeout

一 前言

这篇文章之前发布过,但是结论有误,因为公众号只能修改几个错别字,不能修改文章结论,故重新发布一次,修正之前的结论。

本文通过测试我们要弄清楚两个问题:

a. 继承关系 wait_timeout在session和global级别分别继承那个参数?

b. 生效参数 在交互式会话和程序访问的非交互模式两种情况下到底哪个参数决定了空闲会话的存活时间?

二 参数介绍

首先说明两个关键词通过MySQL客户端连接db的是交互会话,通过jdbc等程序连接db的是非交互会话

interactive_timeout: MySQL服务器关闭交互式连接前等待的秒数。交互式客户端定义为在mysql_real_connect()中使用CLIENT_INTERACTIVE选项的客户端。参数默认值:28800秒。

wait_timeout: MySQL服务器关闭非交互连接之前等待的秒数。在会话启动时,根据全局wait_timeout值或全局interactive_timeout值初始化会话wait_timeout值,取决于客户端连接类型,参数默认值:28800秒。

2.1 继承关系

1) 单独设置global级别的interactive_timeout

session1 [RO] 09:34:20 >set global interactive_timeout=300;
Query OK, 0 rows affected (0.00 sec)
session1 [RO] 09:39:15 >select variable_name,variable_value from information_schema.global_variables where variable_name in ('interactive_timeout','wait_timeout');
+---------------------+----------------+
| variable_name       | variable_value |
+---------------------+----------------+
| INTERACTIVE_TIMEOUT | 300            |
| WAIT_TIMEOUT        | 28800          |
+---------------------+----------------+
2 rows in set (0.00 sec)

session1 [RO] 09:39:21 >select variable_name,variable_value from information_schema.session_variables where variable_name in ('interactive_timeout','wait_timeout');
+---------------------+----------------+
| variable_name       | variable_value |
+---------------------+----------------+
| INTERACTIVE_TIMEOUT | 300            |
| WAIT_TIMEOUT        | 28800          |
+---------------------+----------------+
2 rows in set (0.00 sec)

登陆另外一个会话

session2 [RO] 09:39:35 >select variable_name,variable_value from information_schema.global_variables where variable_name in ('interactive_timeout','wait_timeout');
+---------------------+----------------+
| variable_name       | variable_value |
+---------------------+----------------+
| INTERACTIVE_TIMEOUT | 300            |
| WAIT_TIMEOUT        | 28800          |
+---------------------+----------------+
2 rows in set (0.00 sec)

session2 [RO] 09:39:51 >select variable_name,variable_value from information_schema.session_variables where variable_name in ('interactive_timeout','wait_timeout');
+---------------------+----------------+
| variable_name       | variable_value |
+---------------------+----------------+
| INTERACTIVE_TIMEOUT | 300            |
| WAIT_TIMEOUT        | 300            | 
+---------------------+----------------+
2 rows in set (0.00 sec)

分析在交互模式下

session和global级别的interactive_timeout继承了global级别的interactive_timeout 值。 而session级别的wait_timeout继承了global 级别的interactive_timeout 。global级别的wait_timeout 则不受影响 。

2) 设置session级别的 interactive_timeout

session1 [RO] 09:44:07 >set session interactive_timeout=300;
Query OK, 0 rows affected (0.00 sec)

session1 [RO] 09:44:27 >select variable_name,variable_value from information_schema.global_variables where variable_name in ('interactive_timeout','wait_timeout');
+---------------------+----------------+
| variable_name       | variable_value |
+---------------------+----------------+
| INTERACTIVE_TIMEOUT | 28800          |
| WAIT_TIMEOUT        | 28800          |
+---------------------+----------------+
2 rows in set (0.00 sec)

session1 [RO] 09:44:31 >select variable_name,variable_value from information_schema.session_variables where variable_name in ('interactive_timeout','wait_timeout');
+---------------------+----------------+
| variable_name       | variable_value |
+---------------------+----------------+
| INTERACTIVE_TIMEOUT | 300            |
| WAIT_TIMEOUT        | 28800          |
+---------------------+----------------+
2 rows in set (0.00 sec)

另外开启一个会话

session2 [RO] 09:44:41 >select variable_name,variable_value from information_schema.session_variables where variable_name in ('interactive_timeout','wait_timeout');
+---------------------+----------------+
| variable_name       | variable_value |
+---------------------+----------------+
| INTERACTIVE_TIMEOUT | 28800          |
| WAIT_TIMEOUT        | 28800          |
+---------------------+----------------+
2 rows in set (0.01 sec)

session2 [RO] 09:44:44 >select variable_name,variable_value from information_schema.global_variables where variable_name in ('interactive_timeout','wait_timeout');
+---------------------+----------------+
| variable_name       | variable_value |
+---------------------+----------------+
| INTERACTIVE_TIMEOUT | 28800          |
| WAIT_TIMEOUT        | 28800          |
+---------------------+----------------+
2 rows in set (0.00 sec)

分析

从上面的例子来看 wait_timeout 并不受session级别的interactive_timeout的值的影响。

3) 同时设置两者的值,且不同。session1 [RO] 09:46:42 >set global interactive_timeout=300; Query OK, 0 rows affected (0.00 sec) session1 [RO] 09:46:55 >set global wait_timeout=360; Query OK, 0 rows affected (0.00 sec)

另开启一个会话

session2 [RO] 09:47:20 >select variable_name,variable_value from information_schema.session_variables where variable_name in ('interactive_timeout','wait_timeout');
+---------------------+----------------+
| variable_name       | variable_value |
+---------------------+----------------+
| INTERACTIVE_TIMEOUT | 300            |
| WAIT_TIMEOUT        | 300            |
+---------------------+----------------+
2 rows in set (0.00 sec)

session2 [RO] 09:47:22 >select variable_name,variable_value from information_schema.global_variables where variable_name in ('interactive_timeout','wait_timeout');
+---------------------+----------------+
| variable_name       | variable_value |
+---------------------+----------------+
| INTERACTIVE_TIMEOUT | 300            |
| WAIT_TIMEOUT        | 360            |
+---------------------+----------------+
2 rows in set (0.00 sec)

分析

从案例1和案例2中可以得出session级别的wait_timeout继承global级别的interactive_timeout的值。global级别的wait_timeout则不受影响。在没有改变interactive_timeout的值的情况下,去修改wait_timeout的值结果从session级别来看无效,就会出现前言中我遇到的情况。

2.2 有效参数

通过一个例子检测影响会话的参数是哪个?验证方式通过设置全局的timeout时间(注意两者时间不同),另外起一个会话

session1 [RO] 10:20:56 >set global interactive_timeout=20;
Query OK, 0 rows affected (0.00 sec)
session1 [RO] 10:23:32 >set global wait_timeout=10;
Query OK, 0 rows affected (0.00 sec)

会话2进行查询

mysql> select sleep(5);
+----------+
| sleep(5) |
+----------+
| 0        |
+----------+
1 row in set (5.01 sec)

然后在session1 中 查看show processlist;

分析

会话2 查询等待5s ,状态一直是sleep,20s之后会话关闭而不是10s就关闭。说明wait_timeout时间受global级别的interactive_timeout影响。

2)非交互模式

mysql> select variable_name,variable_value from information_schema.session_variables where variable_name in ('interactive_timeout','wait_timeout');
  +---------------------+----------------+
  | variable_name       | variable_value |
  +---------------------+----------------+
  | INTERACTIVE_TIMEOUT | 35             |
  | WAIT_TIMEOUT        | 35             |
  +---------------------+----------------+
  2 rows in set (0.00 sec)

  mysql> select variable_name,variable_value from information_schema.global_variables where variable_name in ('interactive_timeout','wait_timeout');

  +---------------------+----------------+
  | variable_name       | variable_value |
  +---------------------+----------------+
  | INTERACTIVE_TIMEOUT | 35             |
  | WAIT_TIMEOUT        | 25             |
  +---------------------+----------------+
  2 rows in set (0.00 sec)

使用python程序非交互式访问数据库,查看数据库timeout参数。同时在数据库中执行show processlist 查看python的连接多久会被关闭。

查看session级别的参数

查看show processlist,通过python程序连接数据库的会话等待了25s之后,被中断。

分析

通过python 命令行获取的timeout 参数和交互方式获取的并不一致,在交互命令行中获取session级别的wait_timeout 的值为35,使用非交互命令获取的值为25,说明非交互式的wait_timeout继承全局的wait_timeout。

思考题

session1 通过非交互命令连接到db,此时全局的wait_timeout的值是28800,session 2 修改全局的wait_timeout 为30s ,问题 session1的会话会受到影响吗?

三 总结

1 timeout 只是针对空闲会话有影响。

2 交互模式下:session级别的wait_timeout继承global级别的interactive_timeout的值,而global级别的wait_timeout则不受interactive_timeout的影响。因此要修改交互模式下的wait_timeout,必须同时修改global interactive_timeout的值。

3 非交互模式下: wait_timeout参数继承global级别的wait_timeout,不受interactive_timeout的影响。

上一篇文章 insert 语句加锁机制

原文发表时间:2018-06-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员同行者

使用Nginx转发TCP/UDP数据

5653
来自专栏深度学习计算机视觉

路由器转发算法

分组转发算法 (1) 从数据报的首部提取目的主机的IP地址D, 得出目的网络地址为N。 (2) 若网络N 与此路由器直接相连,则把数据报直接交付目的主机D;...

3347
来自专栏IT可乐

Hadoop 2.7 伪分布式环境搭建

1、安装环境 ①、一台Linux CentOS6.7 系统   hostname                ipaddress              ...

2327
来自专栏Pythonista

windows下vmware配置nat网络

1513
来自专栏从零开始学 Web 前端

从零开始学 Web 之 Ajax(一)服务器相关概念

服务器和客户端都是电脑,在硬件层面上没有明显的划分,配置很差的个人电脑任然可以作为服务器。

1362
来自专栏后端技术探索

初识nginx基础篇-日志管理和切割

Nginx日志主要分为两种,访问日志和错误日志。两种日志可以在http和server模块中配置,nginx有一个非常灵活的日志记录模式。每个级别的...

1042
来自专栏王磊的博客

nodejs常用组件

mssql 用途:连接SqlServer数据库 node-excel-export 用途:导出excel表格 nodegrass 用途:模拟用户进行get/po...

3216
来自专栏一枝花算不算浪漫

[常见问题]在Linux下执行Redis命令不起作用.

3548
来自专栏大前端_Web

webpack相关问题记录

版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://blog.csdn.net/wkyseo/articl...

1222
来自专栏后端技术探索

初识nginx基础篇-日志管理和切割

Nginx日志主要分为两种,访问日志和错误日志。两种日志可以在http和server模块中配置,nginx有一个非常灵活的日志记录模式。每个级别的...

812

扫码关注云+社区

领取腾讯云代金券