首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >浅析interactive_timeout和wait_timeout

浅析interactive_timeout和wait_timeout

作者头像
用户1278550
发布2018-08-09 10:59:53
7250
发布2018-08-09 10:59:53
举报
文章被收录于专栏:idbaidba

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

  1. set global interactive_timeout = 300
  2. session1 [RO] 09:34:20 >set global interactive_timeout=300;
  3. Query OK, 0 rows affected (0.00 sec)
  4. session1 [RO] 09:39:15 >select variable_name,variable_value from information_schema.global_variables where variable_name in ('interactive_timeout','wait_timeout');
  5. +---------------------+----------------+
  6. | variable_name | variable_value |
  7. +---------------------+----------------+
  8. | INTERACTIVE_TIMEOUT | 300 |
  9. | WAIT_TIMEOUT | 28800 |
  10. +---------------------+----------------+
  11. 2 rows in set (0.00 sec)
  12. session1 [RO] 09:39:21 >select variable_name,variable_value from information_schema.session_variables where variable_name in ('interactive_timeout','wait_timeout');
  13. +---------------------+----------------+
  14. | variable_name | variable_value |
  15. +---------------------+----------------+
  16. | INTERACTIVE_TIMEOUT | 300 |
  17. | WAIT_TIMEOUT | 28800 |
  18. +---------------------+----------------+
  19. 2 rows in set (0.00 sec)
  20. 登陆另外一个会话
  21. session2 [RO] 09:39:35 >select variable_name,variable_value from information_schema.global_variables where variable_name in ('interactive_timeout','wait_timeout');
  22. +---------------------+----------------+
  23. | variable_name | variable_value |
  24. +---------------------+----------------+
  25. | INTERACTIVE_TIMEOUT | 300 |
  26. | WAIT_TIMEOUT | 28800 |
  27. +---------------------+----------------+
  28. 2 rows in set (0.00 sec)
  29. session2 [RO] 09:39:51 >select variable_name,variable_value from information_schema.session_variables where variable_name in ('interactive_timeout','wait_timeout');
  30. +---------------------+----------------+
  31. | variable_name | variable_value |
  32. +---------------------+----------------+
  33. | INTERACTIVE_TIMEOUT | 300 |
  34. | WAIT_TIMEOUT | 300 |
  35. +---------------------+----------------+
  36. 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

  1. session1 [RO] 09:44:07 >set session interactive_timeout=300;
  2. Query OK, 0 rows affected (0.00 sec)
  3. session1 [RO] 09:44:27 >select variable_name,variable_value from information_schema.global_variables where variable_name in ('interactive_timeout','wait_timeout');
  4. +---------------------+----------------+
  5. | variable_name | variable_value |
  6. +---------------------+----------------+
  7. | INTERACTIVE_TIMEOUT | 28800 |
  8. | WAIT_TIMEOUT | 28800 |
  9. +---------------------+----------------+
  10. 2 rows in set (0.00 sec)
  11. session1 [RO] 09:44:31 >select variable_name,variable_value from information_schema.session_variables where variable_name in ('interactive_timeout','wait_timeout');
  12. +---------------------+----------------+
  13. | variable_name | variable_value |
  14. +---------------------+----------------+
  15. | INTERACTIVE_TIMEOUT | 300 |
  16. | WAIT_TIMEOUT | 28800 |
  17. +---------------------+----------------+
  18. 2 rows in set (0.00 sec)
  19. 另外开启一个会话
  20. session2 [RO] 09:44:41 >select variable_name,variable_value from information_schema.session_variables where variable_name in ('interactive_timeout','wait_timeout');
  21. +---------------------+----------------+
  22. | variable_name | variable_value |
  23. +---------------------+----------------+
  24. | INTERACTIVE_TIMEOUT | 28800 |
  25. | WAIT_TIMEOUT | 28800 |
  26. +---------------------+----------------+
  27. 2 rows in set (0.01 sec)
  28. session2 [RO] 09:44:44 >select variable_name,variable_value from information_schema.global_variables where variable_name in ('interactive_timeout','wait_timeout');
  29. +---------------------+----------------+
  30. | variable_name | variable_value |
  31. +---------------------+----------------+
  32. | INTERACTIVE_TIMEOUT | 28800 |
  33. | WAIT_TIMEOUT | 28800 |
  34. +---------------------+----------------+
  35. 2 rows in set (0.00 sec)

分析 从上面的例子来看 wait_timeout 并不受session级别的interactive_timeout的值的影响。 3) 同时设置两者的值,且不同。

  1. session1 [RO] 09:46:42 >
  2. (none) [RO] 09:46:42 >set global interactive_timeout=300;
  3. Query OK, 0 rows affected (0.00 sec)
  4. session1 [RO] 09:46:55 >set global wait_timeout=360;
  5. Query OK, 0 rows affected (0.00 sec)
  6. 另开启一个会话
  7. session2 [RO] 09:47:20 >select variable_name,variable_value from information_schema.session_variables where variable_name in ('interactive_timeout','wait_timeout');
  8. +---------------------+----------------+
  9. | variable_name | variable_value |
  10. +---------------------+----------------+
  11. | INTERACTIVE_TIMEOUT | 300 |
  12. | WAIT_TIMEOUT | 300 |
  13. +---------------------+----------------+
  14. 2 rows in set (0.00 sec)
  15. session2 [RO] 09:47:22 >select variable_name,variable_value from information_schema.global_variables where variable_name in ('interactive_timeout','wait_timeout');
  16. +---------------------+----------------+
  17. | variable_name | variable_value |
  18. +---------------------+----------------+
  19. | INTERACTIVE_TIMEOUT | 300 |
  20. | WAIT_TIMEOUT | 360 |
  21. +---------------------+----------------+
  22. 2 rows in set (0.00 sec)

分析 从案例1和案例2中可以得出session级别的wait_timeout 继承global 级别的 interactive_timeout 的值 global级别的session则不受影响。在没有改变 interactive_timeout的值的情况下,去修改wait_timeout的值结果无效。就会出现前言中我遇到的情况2.2 有效参数 通过一个例子检测影响会话的参数是哪个?验证方式通过设置全局的timeout时间(注意两者时间不同),另外起一个会话

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

会话2进行查询

  1. mysql> select sleep(5);
  2. +----------+
  3. | sleep(5) |
  4. +----------+
  5. | 0 |
  6. +----------+
  7. 1 row in set (5.01 sec)

然后在session1 中 查看show processlist;

分析 交互式 timeout时间受global级别的interactive_timeout影响。 2)非交互模式 目前的测试并没有达到预期,测试模型如下设置

  1. mysql> select variable_name,variable_value from information_schema.session_variables where variable_name in ('interactive_timeout','wait_timeout');
  2. +---------------------+----------------+
  3. | variable_name | variable_value |
  4. +---------------------+----------------+
  5. | INTERACTIVE_TIMEOUT | 35 |
  6. | WAIT_TIMEOUT | 35 |
  7. +---------------------+----------------+
  8. 2 rows in set (0.00 sec)
  9. mysql> select variable_name,variable_value from information_schema.global_variables where variable_name in ('interactive_timeout','wait_timeout');
  10. +---------------------+----------------+
  11. | variable_name | variable_value |
  12. +---------------------+----------------+
  13. | INTERACTIVE_TIMEOUT | 35 |
  14. | WAIT_TIMEOUT | 25 |
  15. +---------------------+----------------+
  16. 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。 四 参考资料 注意 本文测试的和参考资料并不完全相符,需要各位读者亲自测试,得到自己的结论。 [1]MySQL timeout相关参数解析和测试 [2]MySQL中interactive_timeout和wait_timeout的区别 [3]官方文档

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-12-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档