【MySQL】浅析interactive_timeout和wait_timeout

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 一 前言   这篇文章源于自己一个无知的提问,作为一个DBA 老鸟,实在汗颜 。如图,修改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  
  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] 官方文档

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
SQL 网络协议 关系型数据库
mysql 连接超时wait_timeout问题解决
com.mysql.jdbc.CommunicationsException: The last packet successfully received from the server was58129 seconds ago.The last packet sent successfully to the server was 58129 seconds ago, which is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or tes
|
6月前
|
关系型数据库 MySQL Linux
mysql 设置wait_timeout连接等待时间
mysql 设置wait_timeout连接等待时间
1516 0
|
SQL druid 关系型数据库
MySQL连接超时时间wait_timeout导致间歇性报错:communication link failure
MySQL连接超时时间wait_timeout导致间歇性报错:communication link failure
855 1
|
7月前
|
关系型数据库 MySQL Java
MySQL中wait_timeout与interactive_timeout详解
MySQL中wait_timeout与interactive_timeout详解
1735 0
|
关系型数据库 MySQL
【MySQL】wait_timeout=120,是干什么的?底层原理是什么?
【MySQL】wait_timeout=120,是干什么的?底层原理是什么?
747 0
|
关系型数据库 MySQL 数据库连接
【MySQL】interactive_timeout=120,是干什么的?底层原理是什么?
【MySQL】interactive_timeout=120,是干什么的?底层原理是什么?
183 0
|
关系型数据库 MySQL Java
Could not open Hibernate Session for transaction; nested exception is org.hibernate.TransactionExcep linux下mysql修改连接超时wait_timeout修改后就ok了
Could not open Hibernate Session for transaction; nested exception is org.hibernate.TransactionExcep linux下mysql修改连接超时wait_timeout修改后就ok了
194 1
|
关系型数据库 MySQL
mysql查看或修改wait_timeout值
mysql查看或修改wait_timeout值
1022 0
|
网络协议 关系型数据库 MySQL
mysql超经典的8小时问题-wait_timeout
mysql超经典的8小时问题-wait_timeout
625 0
|
SQL Oracle 关系型数据库
MySQL:参数wait_timeout和interactive_timeout以及空闲超时的实现
水平有限,如果有误请指出源码版本:percona 5.7.22 一、参数意思 这里简单解释一下两个参数含义如下: interactive_timeout:The number of seconds the server waits for activity on an interactive .
2168 0