猫型iPS細胞研究所

Windows、Linux、iOS、DB、Network

DataBase MySQL

MySQLのwait_timeout

投稿日:2012年12月7日 更新日:

データベースやWebサーバーは、実際に稼働してから問題が多発します。
データ量が増えてきたり、アクセスが増えてきたらまずレスポンスの問題が発生するでしょう。

経験のあるエンジニアがいれば、十分なテストを行ってから稼働するわけですが、なかなかそうもいきません。

今回のテーマはMySQLのwait_timeoutの設定です。
なぜハマってしまうかというと、グローバル変数のwait_timeoutがそのまま個々のセッションのwait_timeoutになるとは限らないからです。

結論からいいますと、

プロセス生成時にグローバル変数のinteractive_timeoutかwait_timeout
が、セッション変数のwait_timeout に反映されます。
そして、どちらが反映されるかは、mysqlのAPI呼出し時に対話型クライアントの定義かどうかできまります。

MySQLサーバーと、サーバ接続を開始するAPI、mysql_real_connect() を呼び出す際、
CLIENT_INTERACTIVE オプションを指定したものが対話型でinteractive_timeout を使用します。
それ以外はwait_timeout がそのままセッション変数のwait_timeoutとなります。

つまり、MySQLと接続するアプリケーションの実装方法によるわけです。
いくらMySQL QueryBrowserのwait_timeoutを確認しても、
問題となっているアプリは別の実装をしてinteractive_timeoutを使用している可能性があります。

結果として、セッション変数のwait_timeout はそのままアイドル状態で破棄されるまでの時間になりますが、
セッション変数のinteractive_timeoutは、実際には使用されません。

注意①
SET GLOBAL で設定したときは、
my.confの設定に追加するのを忘れないようにして下さい。
データベースを再起動すると、デフォルト値に戻ってしまいます。

注意②
容易に想像ができると思いますが、
set global session wait_timeout=5;
でグローバル変数を変更しても、そのセッション変数は変更されないので注意が必要です。
グローバル変数を変更して変更されるのは、その後の新いセッションに対してです。

注意③
あまりwait_timeouを短くしてしまうと、バッチ処理ではタイムアウトが発生する可能性があります。
逆に、APIサーバー等で一瞬の処理を行うにも関わらず、セッションが残ってしまうとtoo many connection
のエラーが発生します。

注意④
デフォルトのinteractive_timeoutとwait_timeoutは同じ値が設定されています。
要するに、この設定の使い方を知らなければ2つ設定がある意味はありません・・・。

MySQLの設定は、あんまり多くありませんし、Webで資料もたくさん見つかります。
が、実際に問題に直面しないとなかなか注意が行き届かないんですよね・・・。

Gooleアドセンス用336

Gooleアドセンス用336

-DataBase, MySQL

執筆者:

関連記事

MySQLの実行速度テスト用PHP

1.testデータベースにtest_tableテーブルを作成。 2.1万件のデータを登録します。 3.1000件のフラグを更新 4.更新したデータを検索する時刻を測定して表示 するサンプルです。 &l …

mysql

MySQLのmysqldumpのエクスポートとインポート

ダンプはバックアップやテストに大活躍してくれます。 しかし、データベース単位でエクスポートしても、インポートには随分時間がかかったりします。 その辺は別の機会にしますが、今回は基本コマンドのまとめです …

mysql

MySQL:エラー:The total number of locks exceeds the lock table size

The total number of locks exceeds the lock table sizeは、大量にデータを削除する場合等に発生する可能性があります。 見ての通り、ロックするメモリー不 …

mysql

MySQL ERROR: Can’t connect to MySQL server on ‘xxx.xxx.x.xx’ (13)

MySQL ERROR: Can’t connect to MySQL server on ‘xxx.xxx.xxx.xxx’ (13) はSELinuxによる接続 …

sqlserver

SQLSERVER「Login failed for user ‘xxxxxxx’. 理由: 指定された名前に一致するログインが見つかりませんでした」

Windows認証でAdministratorを指定しているのにログインできない。 そんな場合は以下の手順でAdministratorユーザーを作成します。 INDEX1 起動時のパラメーターの変更2 …