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

Я смущен результатами. Почему последний запрос дает результат: 28800?MySQL wait_timeout Variable - 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

1

Как указано Riedsio, переменные сеанса не изменяются после подключения, если вы их специально не установили; установка глобальной переменной изменяет только значение сеанса вашего следующего соединения.

Например, если у вас есть 100 соединений, и вы опускаете глобальный wait_timeout, то это не повлияет на существующие соединения, только новые после изменения переменной.

В частности, для переменной wait_timeout переменная, хотя есть поворот. Если вы используете клиент mysql в интерактивном режиме, или разъем с CLIENT_INTERACTIVE установить через mysql_real_connect(), то вы увидите interactive_timeout набор для @@session.wait_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