実行中のMySQLクエリを停止するにはどうすればよいですか?


258

mysqlLinuxシェルから接続します。時々、SELECT大きすぎるクエリを実行します。それは印刷され、印刷されます、そして私はこれが私が意図したものではないことをすでに知っています。クエリを停止します。

打撃Ctrl+C(数回)が殺しmysql完全に、私は再接続する必要がありますので、バックシェルに私を取ります。

mysql自分自身を殺すことなくクエリを停止することは可能ですか?


1
MySQL 5.7がサーバー側のSELECTステートメントのタイムアウトをサポートすることは言及する価値があります。これに関する詳細はこちら:mysqlserverteam.com/server-side-select-statement-timeouts
Morgan

回答:


462
mysql>show processlist;

mysql> kill "number from first col";

1
ありがとう、phpmyadminでそれを行う方法しか知りませんでした!
Zilverdistel 2010

5
しかし、mysql印刷中です...プロンプトが表示されません
David B

34
この基本的なアプローチには同意しますKILL QUERYKILL、この場合よりも使用する方が少し好ましいと思います。そうすれば、クエリは削除されますが、接続は削除されません。
Ike Walker

3
プロセスリストがバッファーを超えてスクロールしている場合に役立つヒントは、ページャーを設定することです。プロンプトで「\ P more」と入力するだけです。ここでは、この先端によりご覧くださいdbasquare.com/2012/03/28/...
スコット・

1
AWS RDS上でMySQLを使用している場合は、実行する権限を持っていませんKILLが、あなたは実行することができます:CALL mysql.rds_kill(12345)
キップ

70

追加するだけ

KILL QUERY **Id** Idは接続IDです show processlist

通常、一部のアプリケーションから実行しているときに接続を強制終了したくない場合は、より望ましい方法です。

詳細については、mysqlのドキュメントをここで読むことができます


これに関連していた質問ですが、接続が再生成されるだけですか、それとも接続を強制終了すると、プールサイズが小さすぎてアプリケーションを実行できなくなりますか?
イロおじさん14年

48

mysqlに接続する

mysql -uusername -p  -hhostname

完全なプロセスリストを表示:

mysql> show full processlist;
+---------+--------+-------------------+---------+---------+------+-------+------------------+
| Id      | User   | Host              | db      | Command | Time | State | Info             |
+---------+--------+-------------------+---------+---------+------+-------+------------------+
| 9255451 | logreg | dmin001.ops:37651 | logdata | Query   |    0 | NULL  | show processlist |
+---------+--------+-------------------+---------+---------+------+-------+------------------+

特定のクエリを強制終了します。ここid = 9255451

mysql> kill 9255451;

権限が拒否された場合は、次のSQLを試してください。

CALL mysql.rds_kill(9255451)

13
注:AWS RDSインスタンスを使用する場合は、最後のクエリが必要です。
キップ

13

mysqladmin暴走クエリを強制終了するために使用します。

次のコマンドを実行します。

mysqladmin -uusername -ppassword pr

次に、プロセスIDを書き留めます。

mysqladmin -uusername -ppassword kill pid

暴走したクエリがリソースを消費することはなくなります。


9

mysqladmin利用できる場合は、クエリのリストを取得できます。

> mysqladmin -uUSERNAME -pPASSWORD pr

+-----+------+-----------------+--------+---------+------+--------------+------------------+
| Id  | User | Host            | db     | Command | Time | State        | Info             |
+-----+------+-----------------+--------+---------+------+--------------+------------------+
| 137 | beet | localhost:53535 | people | Query   | 292  | Sending data | DELETE FROM      |
| 145 | root | localhost:55745 |        | Query   | 0    |              | show processlist |
+-----+------+-----------------+--------+---------+------+--------------+------------------+

次に、長時間実行クエリをホストしているmysqlプロセスを停止します。

> mysqladmin -uUSERNAME -pPASSWORD kill 137

6

プロセスを強制終了するには、次のコマンドを実行する必要があります。

> show processlist;  
> kill query processId;

クエリパラメータは、クエリコマンドプロセスを強制終了する必要があることを指定します。

以下のようなkillプロセスの構文

キル[接続| QUERY] processlist_id

詳細については、このリンクを参照してください。


1

この質問の著者は、通常、MySQLが出力を印刷した後でないと、間違ったクエリが実行されたことに気づきます。すでに述べたように、この場合Ctrl-Cは役に立ちません。ただし、出力が印刷される前にキャッチすると、現在のクエリが中止されることに気づきました 。例えば:

mysql> select * from jos_users, jos_comprofiler;

MySQLは上記の2つのテーブルのデカルト積を生成するのに忙しくなり、MySQLが画面に出力を印刷していない(プロセスの状態はデータの送信中)ことに気付くので、次のように入力しますCtrl-C

Ctrl-C -- sending "KILL QUERY 113240" to server ...
Ctrl-C -- query aborted.
ERROR 1317 (70100): Query execution was interrupted

Ctrl-C同様に、UPDATEクエリを停止するために使用できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.