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?
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, которое является значением по умолчанию. Чтобы изменить значение сеанса, вам нужно установить глобальную переменную, поскольку переменная сеанса доступна только для чтения.
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
Как отмечено 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