2
2

More than 3 years have passed since last update.

MySQL global の wait_timeout は、必ずしも session の wait_timeout に適用されない

Posted at

テストの為に wat_timeout を極端に短く設定したい場面があったのですが、少しまごついたのでメモ。

TL;DR

global の wait_timeout の設定を変更すれば、session の wait_timeout にも適用されると思い込んでいたけど、実際には interactive_timeout の値が適用されたという話。

MySQL の variable 設定の、global と session

まずデフォルトの wait_timeout 値。global の設定はこちら。

mysql> show global variables like 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 28800 |
+---------------+-------+
1 row in set (0.01 sec)

一方、session の設定はこちら。同じ値です。

mysql> show variables like 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 28800 |
+---------------+-------+
1 row in set (0.00 sec)

設定変更その1

その場で設定変更すると、即時反映されます。まずは global の設定変更。例では 10秒に変更しています。

mysql> set global wait_timeout=10;
Query OK, 0 rows affected (0.00 sec)

session の設定を変更するならこちら。

mysql> set wait_timeout=10;
Query OK, 0 rows affected (0.00 sec)

先ほどと同じく show variables like 'wait_timeout'; などのクエリで正しく反映されたことが確認できます。

設定変更その2(つまづき有り)

設定を固定化する為に、設定ファイル /etc/mysql/my.cnf に以下の記述を追記しました。

[mysqld]
wait_timeout = 10

sudo service mysql restart でサービスを再起動し、変更した設定が反映されていることを確認します。

mysql> show global variables like 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 10    |
+---------------+-------+
1 row in set (0.01 sec)

よしよし。では session の方も確認。

mysql> show variables like 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 28800 |  <---  28,000 のまま?
+---------------+-------+
1 row in set (0.00 sec)

10になってないですね。これが想定外です。global を変更したのだから、session にも適用されるはずだと思っていたのですが、調べてみるとクライアントの実装によっては、必ずしもそうではないようです。で、結論を言うと、私の環境では globalの interactive_timeout の設定値が session の wait_timeout に適用されていました。
改めて設定ファイル /etc/mysql/my.cnf に以下の通り修正しました。区別がつくように 11秒としています。

[mysqld]
wait_timeout = 10
interactive_timeout = 11

sudo service mysql restart でサービスを再起動し、session の wait_timeout を確認してみると、無事 11が反映されていました。

mysql> show variables like 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 11    |  <---  interactive_timeout に設定した 11が適用された。
+---------------+-------+
1 row in set (0.01 sec)

リファレンスにも書かれてる話でした。
https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_wait_timeout

On thread startup, the session wait_timeout value is initialized from the global wait_timeout value or from the global interactive_timeout value, depending on the type of client (as defined by the CLIENT_INTERACTIVE connect option to mysql_real_connect()). See also interactive_timeout.

まとめ

環境によっては、global の interactive_timeout が、session の wait_timeout に適用される場合がある。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2