Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 5 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       |
+-----------------------------+----------+
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away