Entwicklung und Datenbanken
Laufende MySQL-Abfragen beenden
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 idstoppt nur die Abfrage und lässt die Verbindung offen. Das ist die empfohlene Option.KILL id(undmysqladmin 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):

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:

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
- Datenbank klonen Duplizieren Sie eine MySQL-Datenbank, indem Sie zuerst das Ziel und seine Berechtigungen in cPanel a...
- Datenbank von MyISAM nach InnoDB konvertieren und die Storage-Engine wechseln Konvertieren Sie MyISAM-Tabellen auf einem geprüften Klon nach InnoDB, prüfen Sie Speicherplatz, Ind...
- Datenbank von utf8 nach utf8mb4 konvertieren Migrieren Sie Tabellen von utf8 nach utf8mb4 in einer geklonten Datenbank, prüfen Sie Collations und...
- Den Fehler bei der Datenbankverbindung in WordPress beheben Was Sie prüfen sollten, wenn WordPress nach einer Migration der Website oder einer Änderung der MySQ...
Stimmt etwas nicht oder hat sich etwas geändert? Erzählen Sie es uns, und wir prüfen es.