Wie finde ich die MySQL-Prozessliste und töte diese Prozesse?

76

Die MySQL-Datenbank hängt aufgrund einiger Abfragen.

Wie kann ich die Prozesse finden und beenden?

Ashish Dadhich
quelle

Antworten:

152

Hier ist die Lösung:

  1. Bei DB anmelden;
  2. Führen Sie einen Befehl aus show full processlist;, um die Prozess-ID mit dem Status abzurufen und selbst abzufragen, wodurch die Datenbank hängen bleibt.
  3. Wählen Sie die Prozess-ID aus und führen Sie einen Befehl aus KILL <pid>;, um diesen Prozess abzubrechen.

Manchmal reicht es nicht aus, jeden Prozess manuell abzubrechen. Dafür müssen wir also einen Trick machen:

  1. Melden Sie sich bei MySQL an.
  2. Führen Sie eine Abfrage aus Select concat('KILL ',id,';') from information_schema.processlist where user='user';, um alle Prozesse mit KILLBefehl zu drucken .
  3. Kopieren Sie das Abfrageergebnis, fügen Sie ein Pipe- |Zeichen ein und entfernen Sie es . Kopieren Sie alles und fügen Sie es erneut in die Abfragekonsole ein. DRÜCKE ENTER. BooM es ist geschafft .
Ashish Dadhich
quelle
8
Diese Abfrage ist großartig! Für alle , auf das mit Licht MySQL Erfahrung suchen , können Sie Filer auch die Abfrage durch Host, db, Command, Time, State, oder Info: SELECT concat('KILL ',id,';') from information_schema.processlist where Command='Sleep'; oder SELECT concat('KILL ',id,';') from information_schema.processlist where Time>'300';
KareemElashmawy
6
Danke für die Anfrage! Ich habe eine erweiterte Version verwendet, die einige manuelle Bearbeitungszeit sparen könnte: select group_concat(concat('KILL ',id,';') separator ' ')So landen alle in einer Zeile, die kopiert werden kann
Architectonic
1
Die Abfrage ist in Ordnung, aber Sie können am Ende Ihren eigenen Prozess beenden. Ich würde die Liste der Prozess-IDs überprüfen, bevor ich "Alle töten" erneut ausführe.
Patrick.SE
2
Tweaking @architectonic 's Kommentar, um mir etwas sofort einfacher aus der Zwischenablage zu handhaben (selbst mit dem lästigen Öffnen und Schließen von doppelten Anführungszeichen) SELECT group_concat(concat('KILL ',id,';') SEPARATOR ' \n') AS KILL_EVERYTHING FROM information_schema.processlist;
leerssej
22
select GROUP_CONCAT(stat SEPARATOR ' ') from (select concat('KILL ',id,';') as stat from information_schema.processlist) as stats;

Kopieren Sie dann das Ergebnis und fügen Sie es wieder in das Terminal ein. Etwas wie:

KILL 2871; KILL 2879; KILL 2874; KILL 2872; KILL 2866;
whistling_marmot
quelle
12

Sie können so etwas tun, um zu überprüfen, ob ein mysqlProzess ausgeführt wird oder nicht:

ps aux | grep mysqld
ps aux | grep mysql

Wenn es dann ausgeführt wird, können Sie Folgendes killallverwenden (abhängig davon, welche Prozesse derzeit ausgeführt werden):

killall -9 mysql
killall -9 mysqld
killall -9 mysqld_safe    
Pritam Banerjee
quelle
5
Das OP fragt nach Prozessen, die auf dem MySQL-Server ausgeführt werden.
Reinierpost
4
Obwohl nicht das, wonach gefragt wurde, hat es geholfen, da dies das erste Element ist, das Google bei der Suche nach dem Beenden aller mysqld-Prozesse unter Linux zurückgegeben hat;)
IncredibleHat