MySQL中如何浅析interactive

60次阅读
没有评论

共计 7234 个字符,预计需要花费 19 分钟才能阅读完成。

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

一 前言
  这篇文章源于自己一个无知的提问,作为一个 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。

以上就是 MySQL 中如何浅析 interactive_timeout 和 wait_timeout,丸趣 TV 小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注丸趣 TV 行业资讯频道。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-19发表,共计7234字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)