MySQL中interactive_timeout和wait_timeout的关系

关注我「程序猿集锦」获取更多分享。

  • 背景
  • interactive_timeout
  • wait_timeout
  • 两者的关系
  • 归纳总结

背景

你应该有遇到过类似于下面的错误信息:

mysql> select now();
ERROR 2013 (HY000): Lost connection to MySQL server during query
mysql> 

这个错误是什么原因引起的呢?这里就不得不说一下MySQL中两个很重要的关于超时的设置:interactive_timeoutwait_timeout

interactive_timeout

当我们使用MySQL数据库客户端工具(这里的数据库客户端有很多:如DBeaver、MySQLWorkbench、Navicat等)、或者命令行连接到MySQL数据库之后(前面说的这样的两种方式连接到MySQL数据库的连接,我们一般称之为交互式的连接。),如果我们长时间不对MySQL数据库发起任何SQL语句,为了节省服务器的资源,MySQL服务会对这样的连接从服务器端主动的进行断开,以便释放客户单连接到服务器后所分配给这个客户单的资源。而这个参数就是用来决定MySQL数据库对那些不活动的连接,间隔多长时间后将其断开。

该参数的单位是seconds,也就是秒,默认值为28800秒,也就是8小时,其最大值为31536000秒,也就是365天。

interactive_timeout这个参数有两个级别,分别是globalsession级别。区别如下:

  • global级别:对全局都有效,在用户登录MySQL服务的时候,如果没有指定局部的interactive_timeout的值,则使用全局的值。
  • session级别:对某个当前正在连接到MySQL服务的客户端用户有效。如果用户连接到MySQL的时候没有指定该参数,则使用global级别的默认值。在设置session级别的值的时候,注意session级别的值,不要超过global级别的值,否则session级别的值,不会生效,仍会使用global级别的值。

查看该参数配置的命令为:

mysql> show global variables where variable_name like 'interactive_timeout';
+---------------------+-------+
| Variable_name       | Value |
+---------------------+-------+
| interactive_timeout | 180   |
+---------------------+-------+
1 row in set (0.00 sec)

mysql> show session variables where variable_name like 'interactive_timeout';
+---------------------+-------+
| Variable_name       | Value |
+---------------------+-------+
| interactive_timeout | 180   |
+---------------------+-------+
1 row in set (0.01 sec)

mysql> 

wait_timeout

当我们使用应用程序通过jdbc的驱动去连接MySQL数据库服务的时候(此时这样的连接,一般我们称之为非交互式的连接。),如果我们的应用很久没有向MySQL数据库发起任何请求,为了减少MySQL服务器端资源的浪费,也会在一段时间后,将那些不活跃的连接断开,以便释放MySQL数据库服务器端的资源。而参数wait_timeout的值,就是用来控制间隔多久后把通过这些非交互的连接给断开。

wait_timeout的单位也是seconds秒。默认值为28800秒,也就是8小时,最大值在Linux平台上也是31536000秒,也就是1年。Windows平台上的默认值为2147483秒,大约是24天。

这个参数在设置的时候,也有globalsession两个级别,也是sssion级别的值要小于等于global级别的值。在session级别没有设置的时候,就是用global级别的值,如果session级别有设置,则使用session级别自己设置的值。这个规则对于MySQL所有的参数设置基本上都是通用的。

查看该参数配置的命令为:

mysql> show global variables where variable_name like 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 10    |
+---------------+-------+
1 row in set (0.00 sec)

mysql> show session variables where variable_name like 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 180   |
+---------------+-------+
1 row in set (0.00 sec)

mysql> 

两者的关系

在与MySQL的连接是交互模式下的时,也就是通过数据库客户端工具或者命令行直接连接到MySQL数据库的时候。session级别的wait_timeout的值会继承global级别的interactive_timeout的值,而不会继承global级别的wait_timeout的值。当然前提是session级别的wait_tiimeout没有设置自己的值,如果它设置了自己的值,当然还是优先使用自己session级别的值,而不会继承任何global级别的值。

在非交互模式下,也就是应用程序通过jdbc驱动的方式去连接到MySQL数据库服务,session级别的wait_timeout的值会继承global级别的wait_timeout的值。当然前提是session级别的wait_tiimeout没有设置自己的值,如果它设置了自己的值,当然还是优先使用自己session级别的值,而不会继承任何global级别的值。

不管是在交互模式下还是在非交互模式下,session级别的interactive_timeout在没有设置自己session级别的值时,它总是会继承global级别的interactive_timeout的值。和global级别的wait_timeout的值没有任何关系。

测试的结果如下:


MySQL中interactive_timeout和wait_timeout的关系


综上,wite_timeoutinteractive_timeout的关系如下所示:


MySQL中interactive_timeout和wait_timeout的关系


归纳总结

掌握了这两个参数的关系,当我们遇到下面的错误的时候,就知道该怎么去配置它们的值了。

The last packet successfully received from the server was 23,579 milliseconds ago. The last packet sent successfully to the server was 0 milliseconds ago.
Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.


MySQL server has gone away


ERROR 2013 (HY000): Lost connection to MySQL server during query

一般情况建议保留两个参数的默认值8小时即可。当我们发现global级别的这两个参数的值都是8小时的时候,仍然有错误提示的时候,可以排查一下是否我们使用的连接池中有默认的设置把这两个值的参数给修改为比较短的时间了。

关注我「程序猿集锦」获取更多分享。

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章