web-dev-qa-db-fra.com

Variable 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

Je suis confus par les résultats. Pourquoi la dernière requête donne-t-elle Résultat: 28800?

50
Arunjith

Le statut de votre session est défini une fois que vous avez démarré une session et que vous prenez par défaut la valeur GLOBAL actuelle.

Si vous vous êtes déconnecté après avoir fait SET @@GLOBAL.wait_timeout=300, Puis reconnecté par la suite, vous verriez

SHOW SESSION VARIABLES LIKE "%wait%";

Result: 300

De même, à tout moment, si vous le faisiez

mysql> SET session wait_timeout=300;

Vous auriez

mysql> SHOW SESSION VARIABLES LIKE 'wait_timeout';

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 300   |
+---------------+-------+
63
Riedsio
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 la session, vous devez définir la variable globale car celle-ci est en lecture seule.

SET @@GLOBAL.wait_timeout=300

Une fois que vous avez 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

Lors du prochain redémarrage du serveur, les variables de session seront définies sur la valeur par défaut, à savoir 28800.

P.S. J'utilise MySQL 5.6.16

17
Anish Tangbe

Comme indiqué par Riedsio , les variables de session ne changent pas après la connexion, sauf si vous les définissez 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 réduisez le total wait_timeout, Cela n'affectera pas les connexions existantes, mais uniquement les nouvelles après la modification de la variable.

Spécifiquement pour la variable wait_timeout Cependant, il y a une torsion. Si vous utilisez le client mysql en mode interactif ou si le connecteur avec CLIENT_INTERACTIVE Est défini via mysql_real_connect(), vous verrez alors le interactive_timeout Défini 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)

Donc, si vous testez cela avec le client, c’est le interactive_timeout Que vous verrez lors de la connexion et non la valeur de wait_timeout

4
Cez