Denn ich sehe dort eine Menge Prozesse, und die Spalte "Zeit" zeigt für alle große Werte an.
Antworten
Zu viele Anzeigen?Massenmord Betrieb spart Zeit. Tun Sie es in MySql selbst:
Führen Sie diese Befehle aus
mysql> select concat('KILL ',id,';') from information_schema.processlist
where user='root' and time > 200 into outfile '/tmp/a.txt';
mysql> source /tmp/a.txt;
---------edit------------
wenn Sie nicht in einer Datei speichern wollen, speichern Sie in einem variable
Führen Sie einfach in Ihrer 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")
Sie müssen sie einen nach dem anderen löschen, MySQL hat keinen massiven Kill-Befehl. Sie können es in jeder Sprache skripten, z.B. in PHP können Sie etwas verwenden wie:
$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);
}
}
Nur für mariaDB
Einfacher geht es nicht. Führen Sie dies einfach in der mysql-Eingabeaufforderung aus.
kill USER username;
Es wird alle Prozesse unter dem angegebenen Benutzernamen beenden. Da die meisten Leute denselben Benutzer für alle Zwecke verwenden, funktioniert es!
Ich habe dies auf MariaDB nicht sicher über mysql getestet.
Ich habe auch nachgeforscht, wie man über MySQL den Befehl SHOW PROCESSLIST parsen kann und bin mit einem Einzeiler in einer Shell gelandet:
mysqladmin processlist -u <USERNAME> -p<PASSWORD> | \
awk '$2 ~ /^[0-9]/ {print "KILL "$2";"}' | \
mysql -u <USERNAME> -p<PASSWORD>
- mysqladmin Prozessliste gibt eine Tabelle mit den Thread-IDs aus;
- awk wird aus der zweiten Spalte nur die Nummern (Thread-IDs) auslesen und MySQL-KILL-Befehle erzeugen;
- und schließlich der letzte Aufruf von mysql wird die übergebenen Befehle ausführen.
Sie können grep vor der awk um einen bestimmten Datenbanknamen zu filtern.
Im Folgenden wird eine einfache gespeicherte Prozedur erstellt, die einen Cursor verwendet, um alle Prozesse nacheinander zu beenden, mit Ausnahme des Prozesses, der gerade verwendet wird:
DROP PROCEDURE IF EXISTS kill_other_processes;
DELIMITER $$
CREATE PROCEDURE kill_other_processes()
BEGIN
DECLARE finished INT DEFAULT 0;
DECLARE proc_id INT;
DECLARE proc_id_cursor CURSOR FOR SELECT id FROM information_schema.processlist;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;
OPEN proc_id_cursor;
proc_id_cursor_loop: LOOP
FETCH proc_id_cursor INTO proc_id;
IF finished = 1 THEN
LEAVE proc_id_cursor_loop;
END IF;
IF proc_id <> CONNECTION_ID() THEN
KILL proc_id;
END IF;
END LOOP proc_id_cursor_loop;
CLOSE proc_id_cursor;
END$$
DELIMITER ;
Es kann ausgeführt werden mit SELECT
s, um die Prozesse davor und danach wie folgt darzustellen:
SELECT * FROM information_schema.processlist;
CALL kill_other_processes();
SELECT * FROM information_schema.processlist;
- See previous answers
- Weitere Antworten anzeigen