猫型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

MySQLのexists

exists自体はほとんどのSQL自体に実装されていると思われます。 しかし、使用方法を誤るとレスポンスに大きな影響を与えてしまします。 副問合せであるexists内部で、集問い合わせのキー列と結合し …

sqlserver

SQL Server Management Studio の「上位200行の編集」を変更したい

恐らく私が十分に使用できていないだけで、機能はたくさんありそうなSQL Server Management Studio。最近新しいものに入れ替えたら(OS毎再インストールするハメになったのですが)、 …

mysql

MySQLのChar型は”(ダブルクォーテーション)ではなく'(シングルクォーテーション)でSELECT

タイトルの通り MySQLのChar型は”(ダブルクォーテーション)ではなく'(シングルクォーテーション)で囲ってSELECT しなければなりません。 正確には、そうしなければパフォーマン …

mysql

ERROR 1840 (HY000) at line 24: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty.

ダンプをインポートしようとすると下記エラーが表示されてインポートできませんでした。 [root@centos]# mysql -u root -p reset master; するとインポートできまし …

select insert

私は以前SQLの順番にinsert selectと呼んでいて、笑われたことがあります。 select insertだ!と当時の上司に言われました。 なるほど、副問い合わせのselectが実行されて、そ …