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

  • 36
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

はじめに結論

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