阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

关于MySQL的interactive_timeout和wait_timeout

415次阅读
没有评论

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

一 前言
  这篇文章源于自己一个无知的提问,作为一个 DBA 老鸟,实在汗颜。如图,修改 wait_timeout 参数之后 并没有及时生效,于是乎去跑到技术支持群里问了。。ps 应该去查 g.cn 才对。。
 关于 MySQL 的 interactive_timeout 和 wait_timeout
  本文 通过 测试我们要弄清楚两个问题
  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;
关于 MySQL 的 interactive_timeout 和 wait_timeout
分析
    交互式 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 的连接多久会被关闭。
关于 MySQL 的 interactive_timeout 和 wait_timeout
查看 session 级别的参数
 关于 MySQL 的 interactive_timeout 和 wait_timeout
查看 show processlist,通过 python 程序连接数据库的会话等待了 25s 之后,被中断。
关于 MySQL 的 interactive_timeout 和 wait_timeout
分析
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]官方文档

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-08/146321.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计7278字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19348
评论数
4
阅读量
7805186
文章搜索
热门文章
开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南 大家好,我是星哥。之前介绍了腾讯云的 Code...
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板 1Panel:小白轻松构建 Web 服务与面板加固指南 哈喽,我是星哥,经常有人问我不...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

  星哥带你玩飞牛 NAS-16:飞牛云 NAS 换桌面,fndesk 图标管理神器上线! 引言 哈...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
Python自学26 – Cookie和Session

Python自学26 – Cookie和Session

Python 自学 26 – Cookie 和 Session 在学习 Web 开发时,Cooki...
星哥带你玩飞牛 NAS-9:全能网盘搜索工具 13 种云盘一键搞定!

星哥带你玩飞牛 NAS-9:全能网盘搜索工具 13 种云盘一键搞定!

星哥带你玩飞牛 NAS-9:全能网盘搜索工具 13 种云盘一键搞定! 前言 作为 NAS 玩家,你是否总被这些...
你的云服务器到底有多强?宝塔跑分告诉你

你的云服务器到底有多强?宝塔跑分告诉你

你的云服务器到底有多强?宝塔跑分告诉你 为什么要用宝塔跑分? 宝塔跑分其实就是对 CPU、内存、磁盘、IO 做...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
星哥带你玩飞牛NAS-11:咪咕视频订阅部署全攻略

星哥带你玩飞牛NAS-11:咪咕视频订阅部署全攻略

星哥带你玩飞牛 NAS-11:咪咕视频订阅部署全攻略 前言 在家庭影音系统里,NAS 不仅是存储中心,更是内容...
手把手教你,购买云服务器并且安装宝塔面板

手把手教你,购买云服务器并且安装宝塔面板

手把手教你,购买云服务器并且安装宝塔面板 前言 大家好,我是星哥。星哥发现很多新手刚接触服务器时,都会被“选购...
仅2MB大小!开源硬件监控工具:Win11 无缝适配,CPU、GPU、网速全维度掌控

仅2MB大小!开源硬件监控工具:Win11 无缝适配,CPU、GPU、网速全维度掌控

还在忍受动辄数百兆的“全家桶”监控软件?后台偷占资源、界面杂乱冗余,想查个 CPU 温度都要层层点选? 今天给...
星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的NAS中!

星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的NAS中!

星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的 NAS 中! 大家对「数据安全感」的需求越来越高 ...
还在找免费服务器?无广告免费主机,新手也能轻松上手!

还在找免费服务器?无广告免费主机,新手也能轻松上手!

还在找免费服务器?无广告免费主机,新手也能轻松上手! 前言 对于个人开发者、建站新手或是想搭建测试站点的从业者...