Sie können auch mysqld neu starten, z. B.sudo service mysqld restart
philfreo
Antworten:
108
Sie müssen sie einzeln töten, MySQL hat keinen massiven Kill-Befehl. Sie können es in jeder Sprache schreiben, zum Beispiel in PHP können Sie Folgendes verwenden:
$result = mysql_query("SHOW FULL PROCESSLIST");while($row=mysql_fetch_array($result)){$process_id=$row["Id"];if($row["Time"]>200){$sql="KILL $process_id";
mysql_query($sql);}}
Wenn Sie nicht in einer Datei speichern möchten, speichern Sie in einer variable
Führen Sie einfach Ihre Eingabeaufforderung aus
> out1=$(mysql -B test -uroot -proot --disable-column-names -e "select concat('KILL ',id,';') from information_schema.processlist where user='root' and time > 200;")> out2=$(mysql -B test -uroot -proot --disable-column-names -e "$out1")
Dies ist eine sehr schlechte Idee ... insbesondere, wenn Sie die Tabellen-Engine im Speicher eingestellt haben, weil alle Daten verloren gehen ... oder wenn Sie den Innodb-Engine-Typ verwenden, weil alle Indizes beim Neustart
wiederholt werden
8
Außerdem werden alle Prozesse in allen Datenbanken abgebrochen
Diego Andrés Díaz Espinoza
10
Einfacher geht es nicht. Führen Sie dies einfach in der MySQL-Eingabeaufforderung aus.
killUSER username;
Alle Prozesse unter dem angegebenen Benutzernamen werden abgebrochen. Da die meisten Leute denselben Benutzer für alle Zwecke verwenden, funktioniert es!
Ich habe dies auf MariaDB getestet und bin mir nicht sicher über MySQL.
In welcher Version von MySQL gibt es das? Ich sehe es nicht in der MySQL 5.7-Referenz dokumentiert . Es gibt keine Beweise dafür, dass es möglich ist, durch Benutzer zu töten : KILL [CONNECTION | QUERY] processlist_id. Ich habe Ihre Abfrage in MySQL 5.6.34 ausprobiert und sie wird als Syntaxfehler angesehen.
Birchlabs
4
Ich habe dies in der Eingabeaufforderung von MySQL 5.6.34 versucht: mysql> kill user root; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'root' at line 1 Wahrscheinlich ist Ihre Antwort nur für MariaDB spezifisch .
Birchlabs
Dies funktioniert nicht für MySQL. Bitte lesen Sie, bevor Sie Ratschläge zu anderen DB-Systemen veröffentlichen ...
RyanH
7
Im Folgenden wird eine einfache gespeicherte Prozedur erstellt, bei der alle Prozesse nacheinander mit einem Cursor beendet werden, mit Ausnahme des aktuell verwendeten Prozesses:
DROPPROCEDUREIFEXISTS kill_other_processes;
DELIMITER $$CREATEPROCEDURE kill_other_processes()BEGINDECLARE finished INT DEFAULT0;DECLARE proc_id INT;DECLARE proc_id_cursor CURSORFORSELECT id FROM information_schema.processlist;DECLARECONTINUE HANDLER FORNOT FOUND SET finished =1;OPEN proc_id_cursor;
proc_id_cursor_loop: LOOP
FETCH proc_id_cursor INTO proc_id;IF finished =1THEN
LEAVE proc_id_cursor_loop;ENDIF;IF proc_id <> CONNECTION_ID()THENKILL proc_id;ENDIF;END LOOP proc_id_cursor_loop;CLOSE proc_id_cursor;END$$
DELIMITER ;
Es kann mit SELECTs ausgeführt werden, um die Prozesse davor und danach wie folgt anzuzeigen:
Ich musste das kürzlich tun und habe mir das ausgedacht
-- GROUP_CONCAT turns all the rows into 1-- @q:= stores all the kill commands to a variableselect@q:=GROUP_CONCAT(CONCAT('KILL ',ID) SEPARATOR ';')FROM information_schema.processlist
-- If you don't need it, you can remove the WHERE command altogetherWHEREuser='user';-- Creates statement and execute it
PREPARE stmt FROM@q;EXECUTE stmt;DEALLOCATE PREPARE stmt;
Auf diese Weise müssen Sie nicht alle Abfragen mit einem einzigen Befehl in einer Datei speichern und ausführen.
Dies ist nicht die Antwort auf die Frage. Hier beenden Sie einen einzelnen Prozess, während die Frage lautet, wie Sie den Prozess sofort beenden können.
Hristo Petev
@ badbod99 Ich bin hier gelandet und habe nach einer Möglichkeit gesucht, einen MySQL-Prozess zu beenden. Diese Antwort hat mir geholfen, also habe ich sie positiv bewertet.
Bogdan
3
Dieser Ausschnitt hat bei mir (MySQL Server 5.5) funktioniert, um alle MySQL-Prozesse zu beenden:
mysql -e "show full processlist;"-ss | awk '{print "KILL "$1";"}'| mysql
SCHRITT 2: Rufen Sie die gespeicherte Prozedur mit dem Namen eines Datenbankbenutzers auf, dessen Prozesse Sie beenden möchten. Sie können die gespeicherte Prozedur neu schreiben, um nach anderen Kriterien zu filtern, wenn Sie möchten.
Sie da. Sie sind sich nicht sicher, ob Sie ein Bot, eine Community oder ein Mensch sind, aber es wäre großartig, wenn Sie einige Wörter hinzufügen würden, die erklären, was mit dieser Codezeile los ist und wie sie das vorliegende Problem löst.
Félix Gagnon-Grenier
1
-U und -p hinzugefügt, um dem Benutzer Zugriff zu gewähren ... funktioniert gut!
Lord St John
2
Wir können es mit MySQL Workbench tun. Führen Sie einfach Folgendes aus:
Dies klingt nach einer besseren Antwort, da oben keine Sprache erwähnt wurde.
DeshDeep Singh
0
Eine einfache Möglichkeit wäre, den MySQL-Server neu zu starten. Öffnen Sie "services.msc" in Windows Run und wählen Sie MySQL aus der Liste aus. Klicken Sie mit der rechten Maustaste und beenden Sie den Dienst. Starten Sie dann erneut, und alle Prozesse außer dem einen (standardmäßig reservierte Verbindung) wurden abgebrochen.
sudo service mysqld restart
Antworten:
Sie müssen sie einzeln töten, MySQL hat keinen massiven Kill-Befehl. Sie können es in jeder Sprache schreiben, zum Beispiel in PHP können Sie Folgendes verwenden:
quelle
for i in {994..1145}; do mysql -uroot -p123456 -e "kill $i" ; done
Massentötung spart Zeit. Tun Sie es in MySql selbst:
Führen Sie diese Befehle aus
Referenz
Wenn Sie nicht in einer Datei speichern möchten, speichern Sie in einer
variable
Führen Sie einfach Ihre Eingabeaufforderung aus
quelle
Ich habe auch gesucht, wie man den Befehl SHOW PROCESSLIST durch MySQL analysiert, und mit einem Einzeiler in einer Shell geendet:
Sie können grep vor dem Befehl awk ausführen , um einen bestimmten Datenbanknamen zu filtern.
quelle
Oder ... in der Schale ...
Ja, ich weiß, ich bin faul, aber es kann auch praktisch sein.
quelle
Einfacher geht es nicht. Führen Sie dies einfach in der MySQL-Eingabeaufforderung aus.
Alle Prozesse unter dem angegebenen Benutzernamen werden abgebrochen. Da die meisten Leute denselben Benutzer für alle Zwecke verwenden, funktioniert es!
Ich habe dies auf MariaDB getestet und bin mir nicht sicher über MySQL.
quelle
KILL [CONNECTION | QUERY] processlist_id
. Ich habe Ihre Abfrage in MySQL 5.6.34 ausprobiert und sie wird als Syntaxfehler angesehen.mysql> kill user root; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'root' at line 1
Wahrscheinlich ist Ihre Antwort nur für MariaDB spezifisch .Im Folgenden wird eine einfache gespeicherte Prozedur erstellt, bei der alle Prozesse nacheinander mit einem Cursor beendet werden, mit Ausnahme des aktuell verwendeten Prozesses:
Es kann mit
SELECT
s ausgeführt werden, um die Prozesse davor und danach wie folgt anzuzeigen:quelle
Ich musste das kürzlich tun und habe mir das ausgedacht
Auf diese Weise müssen Sie nicht alle Abfragen mit einem einzigen Befehl in einer Datei speichern und ausführen.
quelle
TÖTEN SIE ALLE AUSGEWÄHLTEN FRAGEN
quelle
Wenn Sie kein Informationsschema haben:
quelle
Melden Sie sich als Administrator bei MySQL an:
Und dann Befehl ausführen:
Sie erhalten so etwas wie unten:
Sie sehen vollständige Details der verschiedenen Verbindungen. Jetzt können Sie die schlafende Verbindung wie folgt beenden:
quelle
Dieser Ausschnitt hat bei mir (MySQL Server 5.5) funktioniert, um alle MySQL-Prozesse zu beenden:
quelle
Ich würde Bash und MySQL kombinieren:
quelle
Hier ist eine Lösung, die Sie ausführen können, ohne sich auf das Betriebssystem verlassen zu müssen:
SCHRITT 1: Erstellen Sie eine gespeicherte Prozedur.
SCHRITT 2: Rufen Sie die gespeicherte Prozedur mit dem Namen eines Datenbankbenutzers auf, dessen Prozesse Sie beenden möchten. Sie können die gespeicherte Prozedur neu schreiben, um nach anderen Kriterien zu filtern, wenn Sie möchten.
ANRUF
kill_user_processes('devdba');
quelle
quelle
Wir können es mit MySQL Workbench tun. Führen Sie einfach Folgendes aus:
Beispiel:
Das wird es entfernen.
quelle
Eine einfache Möglichkeit wäre, den MySQL-Server neu zu starten. Öffnen Sie "services.msc" in Windows Run und wählen Sie MySQL aus der Liste aus. Klicken Sie mit der rechten Maustaste und beenden Sie den Dienst. Starten Sie dann erneut, und alle Prozesse außer dem einen (standardmäßig reservierte Verbindung) wurden abgebrochen.
quelle
quelle
Manchmal habe ich einige Zombies MySQL-Prozesse, die nicht getötet werden können (mit MAMP Pro).
Holen Sie sich zuerst eine Liste aller MySQL-Prozesse:
Töte als nächstes jeden von ihnen mit (ersetze processId durch die erste Spalte im vorherigen Befehlsergebnis):
quelle
Folgendes hat für mich hervorragend funktioniert:
quelle
Ich habe den Befehl verwendet
flush tables
, um alle inaktiven Verbindungen zu beenden, bei denen es sich tatsächlich um das Massenproblem handelt.quelle
Für die Python-Sprache können Sie dies tun
quelle
Wenn Sie Laravel verwenden, ist dies für Sie:
Natürlich sollten Sie dies
use Illuminate\Support\Facades\DB;
nach Ihrem Namespace verwenden.quelle
Abfrage 1 Wählen Sie concat ('KILL', id, ';') aus information_schema.processlist aus, wobei user = 'username' in outfile '/tmp/a.txt';
Abfrage 2 Quelle a.txt
Auf diese Weise können Sie alle Abfragen in der Show-Prozessliste nach bestimmten Benutzern beenden.
quelle