LoginSignup
90
75

More than 5 years have passed since last update.

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

Posted at

はじめに結論

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