web-dev-qa-db-ja.com

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

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

ご質問

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

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

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)

通常、私はいくつかのタイムアウト変数を監視します。 MySQLをMySQL Workbench、mysqlクライアント、またはPHP app上のアプリケーションサーバー上のアプリケーションから、DBサーバー上の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

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

11
RolandoMySQLDBA