web-dev-qa-db-ja.com

実行中のmysqlクエリを停止する方法

プログラムで実行中のmysqlクエリを停止するにはどうすればよいですか?

私が直面している問題は、クエリがユーザー提供のデータを使用して構築され、実行に非常に長い時間がかかる場合があることです(大きなテーブルは1500万から3000万行)。ユーザーにキャンセルオプションを提供したいのですが、現在実行中のmysql-queryを停止する方法がわかりません。

アプリケーションはJavaアプレット-サーブレット:ユーザーは、リクエストを処理するためにハンドラークラスが作成されるサーブレットに渡されるアプレットの基準を指定します。このハンドラークラスは自己です。含まれている再接続-クエリ-mysqlへの切断。

このシナリオを前提として、実行中のmysql-queryをキャンセルするにはどうすればよいですか?

23
slashmais
SHOW PROCESSLIST;
KILL <thread_to_be_killed>;

詳細については、ドキュメントを参照してください

プロセスリストを表示

実行中のスレッドを強制終了します

40
George Johnston

別のJDBC接続が必要です。つまり、新しいデータベースハンドラインスタンスを作成する必要があります。 SHOW PROCESSLIST ステートメントを実行してから、結果をループし、指定されたユーザーで見つかったスレッドIDごとに [〜#〜] kill [〜#〜] ステートメントを実行します。

これを行うために私が考えることができる唯一の信頼できる方法は、すべてのユーザーが異なるユーザー名でデータベースにログインし、そのユーザーのすべてのスレッドIDを取得して、すべてのスレッドを強制終了する必要があることです。

2
Mark

MySQLが提供する標準ライブラリを介してMySQL固有のコマンドを発行し、 KILL QUERY を実行できます。おそらく、プロセスをリストし、最初にどのスレッドを強制終了する必要があるかを把握するのが最善です。

ただし、アプリケーションによっては、セキュリティの問題が発生する可能性があります(接続しているアプリケーションユーザーにより多くの特権を与える必要があるため)。

1
ziya