2010-12-14 5 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 

Je suis confus par les résultats. Pourquoi la dernière requête donne Result: 28800?MySQL wait_timeout Variable - GLOBAL vs SESSION

Répondre

56

Vos statuts de session sont définis une fois que vous avez démarré une session et, par défaut, prenez la valeur GLOBAL actuelle.

Si vous déconnecté après que vous avez fait SET @@GLOBAL.wait_timeout=300, puis par la suite reconnecté, vous verriez

SHOW SESSION VARIABLES LIKE "%wait%"; 

Result: 300 

De même, à tout moment, si vous avez

mysql> SET session wait_timeout=300; 

Vous obtiendrez

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 

Au début, wait_timeout = 28800 qui est la valeur par défaut. Pour modifier la valeur de session, vous devez définir la variable globale car la variable de session est en lecture seule. Après avoir défini la variable globale, la variable de session saisit automatiquement la valeur.

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

La prochaine fois que le serveur redémarre, les variables de session seront définies sur la valeur par défaut à savoir 28800.

post-scriptum J'utilise MySQL 5.6.16

+2

Votre réponse contredit directement l'OP et vous n'abordez pas la contradiction. – klaar

1

Comme noté par Riedsio, les variables de session ne changent pas après la connexion sauf si vous les avez définies spécifiquement; la définition de la variable globale modifie uniquement la valeur de session de votre prochaine connexion. Par exemple, si vous avez 100 connexions et que vous abaissez le wait_timeout global alors cela n'affectera pas les connexions existantes, seulement les nouvelles après que la variable a été changée. Pour la variable wait_timeout, cependant, il y a une torsion. Si vous utilisez le client mysql en mode interactif ou le connecteur avec CLIENT_INTERACTIVE réglé par mysql_real_connect() alors vous verrez l'ensemble interactive_timeout pour @@session.wait_timeout

Ici vous pouvez voir cette démonstration:

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

Ainsi, si vous testez ceci en utilisant le client c'est le interactive_timeout que vous verrez lors de la connexion et non pas la valeur de wait_timeout