Entwicklung und Datenbanken

Laufende MySQL-Abfragen beenden

Geprüft am 6 Min. Lesezeit MySQL Anfragen

Manchmal dauert eine SQL-Abfrage viel länger als erwartet, wegen eines Fehlers in der Anwendung oder weil sie sehr aufwendig ist. Wenn sie außerdem die Tabelle sperrt, warten die übrigen Abfragen, und die Website hängt. In diesem Fall können Sie die Abfrage manuell beenden.

Es gibt zwei Möglichkeiten, sie zu beenden:

  • KILL QUERY id stoppt nur die Abfrage und lässt die Verbindung offen. Das ist die empfohlene Option.
  • KILL id (und mysqladmin kill id) schließt die gesamte Verbindung, wodurch jede halb abgeschlossene Transaktion zurückgerollt wird.

Im Terminal

Verbinden Sie sich per SSH mit dem Konto. Wenn Sie Erfahrung haben, verwenden Sie das Terminal Ihres Computers; andernfalls ist das in cPanel integrierte Terminal einfacher.

Mit SQL-Abfragen

Melden Sie sich bei MySQL mit einem Benutzer an, der Berechtigungen für die Datenbank hat:

mysql -u usuario_mysql -p

Sie werden nach dem Passwort gefragt. Schreiben Sie es nicht in den Befehl selbst (-pcontraseña), weil es sonst im Verlauf des Terminals bleibt.

Listen Sie die offenen Prozesse auf:

SHOW FULL PROCESSLIST;

Sie sehen eine Tabelle mit jeder Verbindung, ihrem Benutzer, der Datenbank, dem Status, den Sekunden seit dem Start (Time) und der Abfrage (Info):

Ergebnis von SHOW FULL PROCESSLIST mit den laufenden Abfragen

Zeilen mit Command auf Sleep sind inaktive Verbindungen ohne laufende Abfrage: Normalerweise müssen Sie sie nicht anfassen. Die gesuchte hat meist einen hohen Time-Wert und einen Status wie Sending data, Locked oder Waiting for table metadata lock.

Nehmen Sie den Wert der Spalte Id der Abfrage, die Sie beenden möchten, und führen Sie aus:

KILL QUERY 12345;

Führen Sie erneut SHOW FULL PROCESSLIST; aus und prüfen Sie, ob sie nicht mehr erscheint. Wenn sie noch mit dem Status Killed dasteht, macht sie gerade Änderungen rückgängig: Warten Sie einige Sekunden. Wenn sie sich trotzdem nicht beendet, schließen Sie die gesamte Verbindung mit KILL 12345;.

Alle Abfragen eines Benutzers beenden

Wenn sich viele Abfragen desselben Benutzers angesammelt haben, erzeugt Ihnen diese Abfrage die Befehle, um alle zu beenden. Ersetzen Sie USUARIO_MYSQL durch den Benutzer, der sie ausführt:

SELECT GROUP_CONCAT(CONCAT('KILL QUERY ', ID, ';') SEPARATOR ' ')
FROM information_schema.PROCESSLIST
WHERE USER = 'USUARIO_MYSQL'
  AND COMMAND <> 'Sleep'
  AND ID <> CONNECTION_ID();

Kopieren Sie das Ergebnis (etwa KILL QUERY 101; KILL QUERY 102; ...), fügen Sie es ein und führen Sie es aus. Die Bedingung ID <> CONNECTION_ID() verhindert, dass Sie Ihre eigene Sitzung beenden, und COMMAND <> 'Sleep' schließt inaktive Verbindungen aus.

Um nur Abfragen zu beenden, die einen bestimmten Text enthalten, zum Beispiel solche, die auf eine Tabelle wirken, fügen Sie einen weiteren Filter hinzu:

  AND INFO LIKE '%wp_options%'

Im Hosting sehen und beenden Sie nur die Abfragen Ihrer eigenen MySQL-Benutzer.

Mit mysqladmin

Im Terminal können Sie auch mysqladmin verwenden, ohne sich bei MySQL anzumelden. Listen Sie die Prozesse auf:

mysqladmin -u usuario_mysql -p processlist

Und beenden Sie den gewünschten mit seiner Kennung:

mysqladmin -u usuario_mysql -p kill 12345

Sie können mehrere durch Kommas getrennt angeben: kill 101,102,103. Beachten Sie, dass mysqladmin kill die gesamte Verbindung schließt, nicht nur die Abfrage.

Um alle Abfragen, die einen bestimmten Text enthalten (den Namen einer Tabelle, einer Datenbank …), auf einmal zu beenden, kombinieren Sie die Liste mit awk:

mysqladmin -u usuario_mysql -p processlist | awk -F'|' '/TEXTO_A_FILTRAR/ && $6 !~ /Sleep/ {gsub(/ /,"",$2); print $2}' | paste -sd, - | xargs -r mysqladmin -u usuario_mysql -p kill

Der Befehl fragt zweimal nach dem Passwort: einmal zum Auflisten und einmal zum Beenden. Führen Sie vorher nur den ersten Teil aus (bis paste), um zu sehen, welche Kennungen beendet werden.

In phpMyAdmin

Öffnen Sie phpMyAdmin, wählen Sie die Datenbank und öffnen Sie den Reiter SQL. Geben Sie ein:

SHOW FULL PROCESSLIST;

phpMyAdmin zeigt die Prozesstabelle mit einem Link Beenden (Kill) neben jedem Eintrag, um ihn mit einem Klick zu schließen:

Prozessliste in phpMyAdmin mit der Option, jede Abfrage zu beenden

Dieselbe Liste finden Sie auch unter Status > Prozesse. Der Link in phpMyAdmin schließt die gesamte Verbindung; wenn Sie nur die Abfrage stoppen möchten, geben Sie im Reiter SQL KILL QUERY id; ein.

Wenn es wieder passiert

Das Beenden der Abfrage löst den Stau, aber nicht die Ursache. Wenn dieselbe Abfrage oft hängen bleibt, fehlt meist ein Index in der Tabelle, oder ein Plugin oder ein geplanter Job startet sie zu oft. Achten Sie auf den Text in der Spalte Info, um zu erkennen, was sie erzeugt.

Mehr Details in der MySQL-Dokumentation zu KILL.

Das könnte Ihnen auch helfen

Stimmt etwas nicht oder hat sich etwas geändert? Erzählen Sie es uns, und wir prüfen es.