Wie kann ich eine laufende MySQL-Abfrage stoppen?


258

Ich verbinde mysqlmich von meiner Linux-Shell aus. Hin und wieder führe ich eine SELECTAbfrage aus, die zu groß ist. Es druckt und druckt und ich weiß bereits, dass dies nicht das ist, was ich meinte. Ich möchte die Abfrage stoppen.

Das Schlagen Ctrl+C(ein paar Mal) tötet mysqlvollständig und bringt mich zurück zur Shell, sodass ich mich wieder verbinden muss.

Ist es möglich, eine Abfrage zu stoppen, ohne sich mysqlselbst zu töten ?


1
Es ist erwähnenswert, dass MySQL 5.7 ein serverseitiges Timeout für SELECT-Anweisungen unterstützt. Weitere Informationen hierzu finden Sie hier: mysqlserverteam.com/server-side-select-statement-timeouts
Morgan Tocker

Antworten:


462
mysql>show processlist;

mysql> kill "number from first col";

1
Danke, ich wusste nur, wie es in phpmyadmin geht!
Zilverdistel

5
aber mysqldruckt ... Ich kann die Eingabeaufforderung nicht sehen
David B

34
Ich stimme diesem grundlegenden Ansatz zu, aber ich denke, dass die Verwendung für diesen Fall KILL QUERYetwas vorzuziehen KILList. Auf diese Weise wird die Abfrage beendet, nicht jedoch die Verbindung.
Ike Walker

3
Ein nützlicher Tipp, wenn Ihre Prozessliste an Ihrem Puffer vorbeirollt, ist das Einstellen des Pagers. Geben Sie einfach an der Eingabeaufforderung '\ P more' ein. Weitere Informationen
Scott

1
Wenn Sie MySQL unter AWS RDS verwenden, haben Sie keine Berechtigung zum Ausführen KILL, aber Sie können CALL mysql.rds_kill(12345)
Kip

70

Nur um hinzuzufügen

KILL QUERY **Id** Dabei ist ID die Verbindungs-ID show processlist

ist vorzuziehen, wenn Sie die Verbindung normalerweise nicht beenden möchten, wenn Sie von einer Anwendung aus ausgeführt werden.

Für weitere Informationen können Sie das MySQL-Dokument hier lesen


Eine Frage, die ich dazu gestellt hatte: Wird die Verbindung nur wieder hergestellt oder führt das Beenden von Verbindungen dazu, dass die Poolgröße zu klein ist, um von der Anwendung ausgeführt zu werden?
Onkel Iroh

48

Stellen Sie eine Verbindung zu MySQL her

mysql -uusername -p  -hhostname

vollständige Prozessliste anzeigen:

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

Beenden Sie die spezifische Abfrage. Hier ist id = 9255451

mysql> kill 9255451;

Wenn Ihnen die Berechtigung verweigert wird, versuchen Sie Folgendes:

CALL mysql.rds_kill(9255451)

13
Hinweis: Diese letzte Abfrage ist erforderlich, wenn Sie eine AWS RDS-Instanz verwenden.
Kip

13

Verwenden Sie mysqladmindiese Option , um die außer Kontrolle geratene Abfrage zu beenden:

Führen Sie die folgenden Befehle aus:

mysqladmin -uusername -ppassword pr

Notieren Sie sich dann die Prozess-ID.

mysqladmin -uusername -ppassword kill pid

Die außer Kontrolle geratene Abfrage sollte keine Ressourcen mehr verbrauchen.


9

Wenn Sie mysqladminverfügbar haben, erhalten Sie möglicherweise die Liste der Abfragen mit:

> 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 |
+-----+------+-----------------+--------+---------+------+--------------+------------------+

Dann können Sie den MySQL-Prozess stoppen, der die lang laufende Abfrage hostet:

> mysqladmin -uUSERNAME -pPASSWORD kill 137

6

Sie müssen den folgenden Befehl ausführen, um den Prozess abzubrechen.

> show processlist;  
> kill query processId;

Der Abfrageparameter gibt an, dass der Abfragebefehlsprozess abgebrochen werden muss.

Die Syntax für den Kill-Prozess lautet wie folgt

TÖTEN [VERBINDUNG | QUERY] processlist_id

Bitte beziehen Sie sich auf diesen Link für weitere Informationen.


1

Der Autor dieser Frage erwähnt, dass MySQL normalerweise erst nach dem Drucken seiner Ausgabe erkennt, dass die falsche Abfrage ausgeführt wurde. Wie bereits erwähnt, Ctrl-Chilft dies in diesem Fall nicht. Ich habe jedoch festgestellt, dass die aktuelle Abfrage abgebrochen wird - wenn Sie sie abfangen, bevor eine Ausgabe gedruckt wird. Beispielsweise:

mysql> select * from jos_users, jos_comprofiler;

MySQL ist damit beschäftigt, das kartesische Produkt der beiden oben genannten Tabellen zu generieren, und Sie werden schnell feststellen, dass MySQL keine Ausgabe auf den Bildschirm gedruckt hat (der Prozessstatus lautet Daten senden ). Geben Sie also Folgendes ein Ctrl-C:

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

Ctrl-Ckann ebenfalls verwendet werden, um eine UPDATEAbfrage zu stoppen .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.