Как мне убить все процессы в Mysql "show processlist"? - PullRequest
110 голосов
/ 15 декабря 2009

Потому что я вижу там много процессов, а в столбце "время" показаны большие значения для всех них.

Ответы [ 24 ]

196 голосов
/ 30 марта 2012

Массовое убийство операция экономит время. Сделай это в самом MySql:

Выполнить эти команды

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

, если вы не хотите хранить в файле, сохраните в variable

Просто запустите в командной строке

> 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")
100 голосов
/ 15 декабря 2009

Вам нужно убить их одного за другим, MySQL не имеет никакой массовой команды kill. Вы можете написать его на любом языке, например, в PHP вы можете использовать что-то вроде:

$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);
  }
}
16 голосов
/ 16 мая 2012

Я также искал, как проанализировать через MySQL команду SHOW PROCESSLIST и завершился однострочником в Shell:

mysqladmin processlist -u <USERNAME> -p<PASSWORD> | \
awk '$2 ~ /^[0-9]/ {print "KILL "$2";"}' | \
mysql -u <USERNAME> -p<PASSWORD>
  • mysqladmin processlist напечатает таблицу с идентификаторами потоков;
  • awk будет анализировать из второго столбца только числа (идентификаторы потоков) и генерировать команды MySQL KILL;
  • и, наконец, последний вызов mysql выполнит переданные команды.

Вы можете запустить grep перед командой awk для фильтрации определенного имени базы данных.

13 голосов
/ 11 сентября 2014

Или ... в оболочке ...

service mysql restart

Да, я знаю, я ленивый, но это тоже может быть удобно.

12 голосов
/ 20 марта 2017

Это не становится проще, просто выполните это в приглашении mysql.

kill USER username;

Это убьет весь процесс под предоставленным именем пользователя. потому что большинство людей используют одного и того же пользователя для всех целей, это работает!

Я проверял это на MariaDB, не уверен насчет mysql.

5 голосов
/ 28 сентября 2016

Следующее создаст простую хранимую процедуру, которая использует курсор для уничтожения всех процессов по одному, за исключением процесса, который используется в данный момент:

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 ;

Его можно запустить с SELECT s, чтобы показать процессы до и после следующим образом:

SELECT * FROM information_schema.processlist;
CALL kill_other_processes();
SELECT * FROM information_schema.processlist;
5 голосов
/ 31 октября 2013

Если у вас нет information_schema:

mysql -e "show full processlist" | cut -f1 | sed -e 's/^/kill /' | sed -e 's/$/;/' ; > /tmp/kill.txt mysql> . /tmp/kill.txt

4 голосов
/ 04 февраля 2014

УБИТЬ ВСЕ ВЫБРАННЫЕ ЗАПРОСЫ

select concat('KILL ',id,';') 
from information_schema.processlist 
where user='root' 
  and INFO like 'SELECT%' into outfile '/tmp/a.txt'; 
source /tmp/a.txt;
4 голосов
/ 08 ноября 2013

войти в Mysql как администратор:

 mysql -uroot -ppassword;

И чем запустить команду:

mysql> show processlist;

Вы получите что-то вроде ниже:

+----+-------------+--------------------+----------+---------+------+-------+------------------+
| 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 |
+----+-------------+--------------------+----------+---------+------+-------+------------------+

Вы увидите полную информацию о различных подключениях. Теперь вы можете разорвать спящее соединение, как показано ниже:

mysql> kill 52;
Query OK, 0 rows affected (0.00 sec)
3 голосов
/ 01 июня 2016

Этот отрывок сработал для меня (MySQL server 5.5), чтобы убить все процессы MySQL:

mysql -e "show full processlist;" -ss | awk '{print "KILL "$1";"}'| mysql
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...