使用 SET GLOBAL 更改变量不会影响会话变量?

Abd*_*naf 5 mysql mysql-5.6

我在设置全局和会话参数之间有点困惑,我正在尝试设置 wait_timeout

默认设置是

SELECT @@global.wait_timeout , @@session.wait_timeout;
+-----------------------+------------------------+
| @@global.wait_timeout | @@session.wait_timeout |
+-----------------------+------------------------+
|                 28800 |                  28800 |
+-----------------------+------------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

以下 SQL 将更改会话设置

SET wait_timeout = 10;
Query OK, 0 rows affected (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

检查值,这也很清楚

SELECT @@global.wait_timeout , @@session.wait_timeout;
+-----------------------+------------------------+
| @@global.wait_timeout | @@session.wait_timeout |
+-----------------------+------------------------+
|                 28800 |                     10 |
+-----------------------+------------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

下面的 SQL 将全局更改它

SET GLOBAL wait_timeout = 10;
Query OK, 0 rows affected (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

检查值,这也很清楚

SELECT @@global.wait_timeout , @@session.wait_timeout;
+-----------------------+------------------------+
| @@global.wait_timeout | @@session.wait_timeout |
+-----------------------+------------------------+
|                    10 |                     10 |
+-----------------------+------------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

现在,我正在关闭 MySQL 线程并打开一个新线程,我找到以下数据

SELECT @@global.wait_timeout , @@session.wait_timeout;
+-----------------------+------------------------+
| @@global.wait_timeout | @@session.wait_timeout |
+-----------------------+------------------------+
|                    10 |                  28800 |
+-----------------------+------------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

由于我已经使用 SET GLOBAL 更改了值,因此此时我无法解释会话设置为何已更改。

Abd*_*naf 8

为了改变,wait_timeout我们也应该改变interactive_timeout变量。

定义wait_timeout:服务器在关闭非交互式连接之前等待活动的秒数。在线程启动时,会话wait_timeout 值从全局wait_timeout 值或全局interactive_timeout 值初始化。

这是测试

查询不改变任何参数,所有值默认设置为8小时

SELECT @@global.wait_timeout , @@session.wait_timeout , @@global.interactive_timeout , @@session.interactive_timeout;
+-----------------------+------------------------+------------------------------+-------------------------------+
| @@global.wait_timeout | @@session.wait_timeout | @@global.interactive_timeout | @@session.interactive_timeout |
+-----------------------+------------------------+------------------------------+-------------------------------+
|                 28800 |                  28800 |                        28800 |                         28800 |
+-----------------------+------------------------+------------------------------+-------------------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

在会话级别更改参数

SET wait_timeout = 10 , interactive_timeout = 10;
Query OK, 0 rows affected (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

结果,一切都如预期般顺利,全局设置保持不变,会话设置已更改

SELECT @@global.wait_timeout , @@session.wait_timeout , @@global.interactive_timeout , @@session.interactive_timeout;
+-----------------------+------------------------+------------------------------+-------------------------------+
| @@global.wait_timeout | @@session.wait_timeout | @@global.interactive_timeout | @@session.interactive_timeout |
+-----------------------+------------------------+------------------------------+-------------------------------+
|                 28800 |                     10 |                        28800 |                            10 |
+-----------------------+------------------------+------------------------------+-------------------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

在全局级别更改参数

SET GLOBAL wait_timeout = 10 ;
Query OK, 0 rows affected (0.00 sec)

SET GLOBAL interactive_timeout = 10;
Query OK, 0 rows affected (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

结果,一切都符合预期

SELECT @@global.wait_timeout , @@session.wait_timeout , @@global.interactive_timeout , @@session.interactive_timeout;
+-----------------------+------------------------+------------------------------+-------------------------------+
| @@global.wait_timeout | @@session.wait_timeout | @@global.interactive_timeout | @@session.interactive_timeout |
+-----------------------+------------------------+------------------------------+-------------------------------+
|                    10 |                     10 |                           10 |                            10 |
+-----------------------+------------------------+------------------------------+-------------------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

断开 MySQL 线程并再次连接,一切看起来又好了

SELECT @@global.wait_timeout , @@session.wait_timeout , @@global.interactive_timeout , @@session.interactive_timeout;
+-----------------------+------------------------+------------------------------+-------------------------------+
| @@global.wait_timeout | @@session.wait_timeout | @@global.interactive_timeout | @@session.interactive_timeout |
+-----------------------+------------------------+------------------------------+-------------------------------+
|                    10 |                     10 |                           10 |                            10 |
+-----------------------+------------------------+------------------------------+-------------------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)