はじめに結論
wait_timeout のデフォルト値はクライアントの接続モードによって変わる。
- 接続が対話型の場合は interactive_timeout のグローバル変数値
- 接続が非対話型の場合は wait_timeout のグローバル変数値
(対話型である)mysql コマンドのプロンプトで確認した設定値が、(非対話型の)プログラムでも同じであるとは限らないので注意!
wait_timeout とは
接続のアイドルタイムアウト秒数。
この秒数クライアントからの反応がない場合、MySQL サーバはクライアントとの接続を切る。
接続が切られた状態でクエリを送った場合、"Lost connection to server during query" や "MySQL server has gone away" のエラーが発生する。
#【ワナ】wait_timeout のデフォルト値(interactive_timeout との関係)
リファレンスマニュアルをよく読むと書いてある。(引用元は 5.6 の記述だが、5.1, 5.5, 5.7 でも同様)
スレッド開始時に、セッションの wait_timeout 値は、wait_timeout グローバル値または interactive_timeout グローバル値で初期化されますが、いずれになるかはクライアントのタイプ (mysql_real_connect() に対する CLIENT_INTERACTIVE 接続オプションによって定義される) によって決まります。interactive_timeoutも参照してください。
サーバーが対話型の接続で、対話型の接続を閉じる前にアクティビティーを待機する秒数。対話型クライアントは、mysql_real_connect() で CLIENT_INTERACTIVE オプションを使用するクライアントと定義されます。wait_timeoutも参照してください。
要するに、セッションローカルの wait_timeout のデフォルト値は以下の通りになる。
- 接続が対話型(CLIENT_INTERACTIVE オプション有り)の場合は interactive_timeout のグローバル変数値
- 接続が非対話型(CLIENT_INTERACTIVE オプション無し)の場合は wait_timeout のグローバル変数値
#実際に試してみる
事前準備:
my.cnf に wait_timeout=60 の設定を記述して mysql サーバを再起動しておく。
対話型モードでの実行:
wait_timeout は 28800 になる。
% mysql -u root
mysql> SHOW VARIABLES LIKE '%timeout%';
+-----------------------------+----------+
| Variable_name | Value |
+-----------------------------+----------+
| connect_timeout | 10 |
| delayed_insert_timeout | 300 |
| innodb_flush_log_at_timeout | 1 |
| innodb_lock_wait_timeout | 50 |
| innodb_rollback_on_timeout | OFF |
| interactive_timeout | 28800 |
| lock_wait_timeout | 31536000 |
| net_read_timeout | 30 |
| net_write_timeout | 60 |
| slave_net_timeout | 3600 |
| wait_timeout | 28800 |
+-----------------------------+----------+
11 rows in set (0.00 sec)
非対話型モードでの実行:
wait_timeout は 60 になる。
% mysql -u root -e "show variables like '%timeout%'"
+-----------------------------+----------+
| Variable_name | Value |
+-----------------------------+----------+
| connect_timeout | 10 |
| delayed_insert_timeout | 300 |
| innodb_flush_log_at_timeout | 1 |
| innodb_lock_wait_timeout | 50 |
| innodb_rollback_on_timeout | OFF |
| interactive_timeout | 28800 |
| lock_wait_timeout | 31536000 |
| net_read_timeout | 30 |
| net_write_timeout | 60 |
| slave_net_timeout | 3600 |
| wait_timeout | 60 |
+-----------------------------+----------+