加入收藏 | 设为首页 | 会员中心 | 我要投稿 银川站长网 (https://www.0951zz.com/)- 云通信、基础存储、云上网络、机器学习、视觉智能!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL中如何分析interactive_timeout和wait_timeout

发布时间:2023-08-10 12:56:03 所属栏目:MySql教程 来源:
导读:本篇文章给大家分享的是有关MySQL中如何浅析interactive_timeout和wait_timeout,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一 前言 这篇文章

本篇文章给大家分享的是有关MySQL中如何浅析interactive_timeout和wait_timeout,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

一 前言

 这篇文章源于自己一个无知的提问,作为一个DBA 老鸟,实在汗颜 。如图,修改wait_timeout参数之后 并没有及时生效,于是乎去跑到技术支持群里问了。。ps 应该去查g.cn 才对。

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

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

 b 生效参数 在会话中到底哪个参数决定了会话的存活时间?

二 参数介绍 

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

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

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

2.1 继承关系 

1) 单独设置global级别的interactive_timeout 

set global interactive_timeout = 300

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 继承了 interactive_timeout global的值。而 wait_timeout 的值,session级别继承了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 >

(none) [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级别的session则不受影响。在没有改变 interactive_timeout的值的情况下,去修改wait_timeout的值

 结果无效。就会出现前言中我遇到的情况。

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;

分析

   交互式 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之后,被中断。

分析

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

2 交互模式下会话空闲时间超过wait_timeout立即会被断开。

3) 思考题

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

三 总结

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

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

 3 交互式会话的timeout时间受global级别的interactive_timeout影响。因此要修改非交互模式下的timeout,必须同时修改interactive_timeout的值。

 4 非交互模式下,wait_timeout参数继承global级别的wait_timeout。

(编辑:银川站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章