MySQL的wait_timeoutvariables – 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?

一旦你开始一个会话,你的会话状态就会被设置,默认情况下,取当前的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这是默认值。 要更改会话值,您需要设置全局variables,因为会话variables是只读的。

 SET @@GLOBAL.wait_timeout=300 

设置全局variables后,会话variables会自动获取该值。

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

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

PS我使用MySQL 5.6.16

正如Riedsio所指出的,会话variables在连接之后不会改变,除非您专门设置它们; 设置全局variables只会改变下一个连接的会话值。

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

特别是对于wait_timeoutvariables,有一个转折点。 如果您以交互模式使用mysql客户端,或者使用通过mysql_real_connect()设置的CLIENT_INTERACTIVE连接器,则会看到为@@session.wait_timeout设置的interactive_timeout

在这里你可以看到这个certificate:

 > ./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) 

所以,如果您使用客户端进行testing,那么您将在连接时看到的是interactive_timeout ,而不是wait_timeout的值