140 Stimmen

Wie kann ich alle Prozesse in Mysql "show processlist" beenden?

Denn ich sehe dort eine Menge Prozesse, und die Spalte "Zeit" zeigt für alle große Werte an.

239voto

Angelin Nadar Punkte 8458

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;

Referenz

---------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")

113voto

Michal Čihař Punkte 9417

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);
  }
}

17voto

Maulik Punkte 2579

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.

16voto

m8t Punkte 329

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.

10voto

Steve Chambers Punkte 33674

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;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X