MySQL wait_timeout 变量-GLOBAL vs SESSION

SHOW VARIABLES LIKE "%wait%"


Result: 28800


SET @@GLOBAL.wait_timeout=300


SHOW GLOBAL VARIABLES LIKE "%wait%"


Result: 300


SHOW SESSION VARIABLES LIKE "%wait%"


Result:28800

我对结果感到困惑。为什么最后一个查询给出的结果是: 28800?

181868 次浏览

一旦启动会话,就会设置会话状态,默认情况下,采用当前的 GLOBAL 值。

如果你在做了 SET @@GLOBAL.wait_timeout=300之后断开连接,然后重新连接,你会看到

SHOW SESSION VARIABLES LIKE "%wait%";


Result: 300

同样,在任何时候,如果你这样做

mysql> SET session wait_timeout=300;

你会得到

mysql> SHOW SESSION VARIABLES LIKE 'wait_timeout';


+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 300   |
+---------------+-------+
SHOW SESSION VARIABLES LIKE "wait_timeout"; -- 28800
SHOW GLOBAL VARIABLES LIKE "wait_timeout"; -- 28800

首先,wait _ timeout = 28800,这是默认值。要更改会话值,需要设置全局变量,因为会话变量是只读的。

SET @@GLOBAL.wait_timeout=300

设置全局变量后,会话变量将自动获取该值。

SHOW SESSION VARIABLES LIKE "wait_timeout"; -- 300
SHOW GLOBAL VARIABLES LIKE "wait_timeout"; -- 300

下次服务器重新启动时,会话变量将被设置为默认值,即28800。

附注: 我使用的是 MySQL 5.6.16

正如 Riedsio所指出的,除非您专门设置了会话变量,否则会话变量在连接后不会更改; 设置全局变量只会更改下一个连接的会话值。

例如,如果您有100个连接,并且降低了全局 wait_timeout,那么它不会影响现有的连接,只会影响变量更改后的新连接。

但是,对于 wait_timeout变量,有一个特殊的变化。 如果您在交互模式下使用 mysql客户机,或者通过 mysql_real_connect()设置 CLIENT_INTERACTIVE的连接器,那么您将看到 @@session.wait_timeoutinteractive_timeout设置

在这里你可以看到这个演示:

> ./bin/mysql -Bsse 'select @@session.wait_timeout, @@session.interactive_timeout, @@global.wait_timeout, @@global.interactive_timeout'
70      60      70      60


> ./bin/mysql -Bsse 'select @@wait_timeout'
70


> ./bin/mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 5.7.12-5 MySQL Community Server (GPL)


Copyright (c) 2009-2016 Percona LLC and/or its affiliates
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.


Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.


Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


mysql> select @@wait_timeout;
+----------------+
| @@wait_timeout |
+----------------+
|             60 |
+----------------+
1 row in set (0.00 sec)

因此,如果您正在使用客户端测试这个,那么您将在连接时看到的是 interactive_timeout,而不是 wait_timeout的值