テストの為に 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
に適用される場合がある。