Posted at

MySQL の wait_timeout デフォルト値のワナ(接続モードによる値の違い)

More than 3 years have passed since last update.


はじめに結論

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 |
+-----------------------------+----------+