猫型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で相関サブクエリを実行する

相関サブクエリとは、SQLの実行結果の行と行を比較することです。 ある行とある行の時間差を求めることで何秒間隔でデータが登録されているかがわかったり、 ある行とある行の売上差を求めることで、売上の上が …

sqlserver

「.NET」と「ASP.NET」からのSQL Serverへのコネクションを確認する(2)

「.NET」と「ASP.NET」からの接続には大きな違いがあります。 それは普通の?(exe形式の)アプリケーションか、Webアプリケーションかです。 この違いはアプリの終了というタイミングに大きく影 …

mysql

CentOS6.4にMySQL5.6をインストールする

INDEX1 RPMのダウンロード2 tarの解凍3 rpmをyumでインストール4 サービス名が違う?5 mysql_secretにrootの初期パスワードはある6 mysql_secure_ins …

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; するとインポートできまし …

sqlserver

SQLSERVER サービス起動用ユーザーを作成する

SQLサーバーのサービスを起動しているのは、デフォルトではおそらくAdministratorです。 ここに大きな落とし穴があります。 Administratroのパスワードを変更することはセキュリティ …