2010-12-14 76 views
41
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 

我对结果感到困惑。为什么最后的查询会给出Result:28800?MySQL wait_timeout变量 - GLOBAL vs SESSION

回答

56

您的会话状态会在您开始会话后设置,并且默认情况下采用当前的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 | 
+---------------+-------+ 
11
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

P.S.我正在使用MySQL 5.6.16

+2

您的回答直接与OP相矛盾,并且您没有解决矛盾。 – klaar 2016-01-05 09:49:57

1

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

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

特别是对于wait_timeout变量,有一个转折点。 如果您使用的是mysql客户端的交互方式,或者用CLIENT_INTERACTIVE连接器通过mysql_real_connect()设置,那么您将看到@@session.wait_timeout

这里interactive_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的值