MySQLクエリの実行中にクライアントがタイムアウトしますか?


9

MySQLワークベンチを介して実行された読み取り専用クエリがユーザーのUIの観点からタイムアウトになり、停止が発生するまでサーバー上で実行され続けた(そしてますます多くのリソースを消費している)という問題が発生しました。

ご質問

  • MySQLでこの種の問題に対処する標準的な方法はありますか?
  • 私たちが避けなければならない根本的な原因はありますか?

回答:


11

タイムアウトに設定されているデフォルト値を確認する必要があります。

mysql> show variables like '%timeout';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| connect_timeout            | 10    |
| delayed_insert_timeout     | 300   |
| innodb_lock_wait_timeout   | 50    |
| innodb_rollback_on_timeout | OFF   |
| interactive_timeout        | 60    |
| net_read_timeout           | 30    |
| net_write_timeout          | 60    |
| slave_net_timeout          | 3600  |
| table_lock_wait_timeout    | 50    |
| wait_timeout               | 60    |
+----------------------------+-------+
10 rows in set (0.00 sec)

通常、私はいくつかのタイムアウト変数を監視します。これは、DBサーバー上のMySQLに接続するアプリケーションサーバー上のMySQL Workbench、mysqlクライアント、またはPHPアプリからMySQLをリモートで使用する場合に非常に不可欠です。

MySQLのドキュメントでは、これらの設定の1つを以下に示しています。

  • wait_timeout(デフォルトは28800 [8時間]):サーバーが非対話型接続でのアクティビティを待機してから閉じるまでの秒数。このタイムアウトは、TCP / IPおよびUnixソケットファイル接続にのみ適用され、名前付きパイプまたは共有メモリを使用して行われた接続には適用されません。スレッドの起動時に、セッションのwait_timeout値は、クライアントのタイプに応じて(mysql_real_connect()へのCLIENT_INTERACTIVE接続オプションで定義されているように)、グローバルのwait_timeout値またはグローバルのinteractive_timeout値から初期化されます。Interactive_timeoutも参照してください。
  • interactive_timeout(デフォルト28800 [8時間]):サーバーがインタラクティブ接続を閉じる前に、インタラクティブ接続でのアクティビティを待機する秒数。インタラクティブクライアントは、mysql_real_connect()にCLIENT_INTERACTIVEオプションを使用するクライアントとして定義されます。wait_timeoutも参照してください。
  • net_read_timeout(デフォルト30):読み取りを中止する前に、接続からの追加データを待機する秒数。サーバーがクライアントから読み取っている場合、net_read_timeoutは、いつ打ち切るかを制御するタイムアウト値です。サーバーがクライアントに書き込んでいるとき、net_write_timeoutはいつ打ち切るかを制御するタイムアウト値です。slave_net_timeoutも参照してください。
  • net_write_timeout(デフォルト60):書き込みを中止する前にブロックが接続に書き込まれるのを待つ秒数。net_read_timeoutも参照してください。

これらのタイムアウトが非常に長い時間実行される可能性があるクエリに対応できる十分な高さに設定されていることを確認してください。

  • 質量 UPDATEs
  • 質量 DELETEs
  • ENABLE KEYS 大きなMyISAM

触れなくなった後も実行を続けるクエリを処理するには、長時間実行されているクエリのプロセスIDに対してKILLを実行する必要があります。KILLコマンドを使用した場合でも、ディスクを集中的に使用するステップの途中、または内部mutexが進行中のクエリを待つ必要があります。


長期間実行されているプロセスに対してKILLを実行するための標準的で堅牢な方法はありますか、それとも通常bashスクリプト/ cronジョブを介して行われますか?
asthasr 2012年

:私は実際にDB接続の束を殺すためにINFORMATION_SCHEMAを使用してスクリプトを起動する方法について2011年5月中にポストバック書いdba.stackexchange.com/a/2637/877
RolandoMySQLDBA

「これらのタイムアウトが非常に長い時間実行される可能性のあるクエリに対応するのに十分な高さに設定されていることを確認してください:大量の更新...」例:php + mysqlテーブルの列からすべてのレコードを選択する必要があるため、フェッチ行を作成してから何かを実行してから、別のレコードを新しい値で更新します。このスクリプトに必要な時間は約5分以上です。最初にSELECTを1つ、最後に1つのUPDATEを実行し、行をフェッチして、途中で行います。この状況でwait_timeoutを実行する必要がある理由を説明できますか?本当に私にははっきりしていません...リソースを解放するためのwait_timeoutの安全な値は何ですか
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.