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.

4voto

Fedir RYKHTIK Punkte 9464

Dieser Ausschnitt funktionierte bei mir (MySQL-Server 5.5), um alle MySQL-Prozesse zu beenden:

mysql -e "show full processlist;" -ss | awk '{print "KILL "$1";"}'| mysql

4voto

wiebel Punkte 51

Ich würde bash und mysql kombinieren:

for i in $(mysql -Ne "select id from information_schema.processlist where user like 'foo%user' and time > 300;"); do
  mysql -e "kill ${i}"
done

2voto

user3721740 Punkte 99
mysqladmin pr -u 'USERNAME' -p'PASSWORD' | awk '$2~/^[0-9]+/{print $2}' | xargs -i mysqladmin -u 'USERNAME' -p'PASSWORD' kill {}

2voto

Dan Spiegel Punkte 31

Hier ist eine Lösung, die Sie ausführen können, ohne sich auf das Betriebssystem zu verlassen:

SCHRITT 1: Erstellen Sie eine gespeicherte Prozedur.

DROP PROCEDURE IF EXISTS  kill_user_processes$$ 

CREATE PROCEDURE `kill_user_processes`(
  IN user_to_kill VARCHAR(255)
)
READS SQL DATA
BEGIN

  DECLARE name_val VARCHAR(255);
  DECLARE no_more_rows BOOLEAN;
  DECLARE loop_cntr INT DEFAULT 0;
  DECLARE num_rows INT DEFAULT 0;

  DECLARE friends_cur CURSOR FOR
    SELECT CONCAT('KILL ',id,';') FROM information_schema.processlist WHERE USER=user_to_kill;

  DECLARE CONTINUE HANDLER FOR NOT FOUND
    SET no_more_rows = TRUE;

  OPEN friends_cur;
  SELECT FOUND_ROWS() INTO num_rows;

  the_loop: LOOP

    FETCH  friends_cur
    INTO   name_val;

    IF no_more_rows THEN
        CLOSE friends_cur;
        LEAVE the_loop;
    END IF;

 SET @s = name_val;
    PREPARE stmt FROM @s;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;

    SELECT name_val;

    SET loop_cntr = loop_cntr + 1;

  END LOOP the_loop;

  SELECT num_rows, loop_cntr;

END $$
DELIMITER ;

SCHRITT 2: Rufen Sie die gespeicherte Prozedur auf und geben Sie den Namen des Datenbankbenutzers an, dessen Prozesse Sie beenden möchten. Sie können die gespeicherte Prozedur umschreiben, um nach anderen Kriterien zu filtern, wenn Sie möchten.

ANRUFEN kill_user_processes('devdba');

1voto

Suresh Kamrushi Punkte 14582

Melden Sie sich bei Mysql als Administrator an:

 mysql -uroot -ppassword;

Und dann den Befehl ausführen:

mysql> show processlist;

Sie erhalten dann eine Meldung wie die folgende:

+----+-------------+--------------------+----------+---------+------+-------+------------------+
| Id | User        | Host               | db       | Command | Time | State | Info             |
+----+-------------+--------------------+----------+---------+------+-------+------------------+
| 49 | application | 192.168.44.1:51718 | XXXXXXXX | Sleep   |  183 |       | NULL             ||
| 55 | application | 192.168.44.1:51769 | XXXXXXXX | Sleep   |  148 |       | NULL             |
| 56 | application | 192.168.44.1:51770 | XXXXXXXX | Sleep   |  148 |       | NULL             |
| 57 | application | 192.168.44.1:51771 | XXXXXXXX | Sleep   |  148 |       | NULL             |
| 58 | application | 192.168.44.1:51968 | XXXXXXXX | Sleep   |   11 |       | NULL             |
| 59 | root        | localhost          | NULL     | Query   |    0 | NULL  | show processlist |
+----+-------------+--------------------+----------+---------+------+-------+------------------+

Sie erhalten vollständige Angaben zu den verschiedenen Verbindungen. Jetzt können Sie die schlafende Verbindung wie unten beschrieben beenden:

mysql> kill 52;
Query OK, 0 rows affected (0.00 sec)

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