it-roy-ru.com

Как мне убить все процессы в Mysql "show processlist"?

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

103
TIMEX

Вам нужно убить их одного за другим, 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);
  }
}
96
Michal Čihař

Операция массового уничтожения экономит время. Сделайте это в самом 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")
190
Angelin Nadar

Я также искал, как проанализировать через 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 , чтобы отфильтровать определенное имя базы данных.

16
m8t

Или ... в Shell ...

service mysql restart

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

12
EcchiOli

Это не становится проще, просто выполните это в MySQL Prompt.

kill USER username;

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

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

10
Maulik Gangani

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

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

5
mikesl

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

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 ;

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

SELECT * FROM information_schema.processlist;
CALL kill_other_processes();
SELECT * FROM information_schema.processlist;
4
Steve Chambers

войти в 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)
4
Suresh Kamrushi

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

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
user3269995

Вот решение, которое вы можете выполнить, не полагаясь на операционную систему:

ШАГ 1. Создайте хранимую процедуру. 

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 ;

ШАГ 2: Вызовите хранимую процедуру, дав ей имя пользователя базы данных, процессы которого вы хотите уничтожить. Вы можете переписать хранимую процедуру для фильтрации по некоторым другим критериям, если хотите.

ВЫЗОВ kill_user_processes('devdba');

3
Dan Spiegel

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

mysql -e "show full processlist;" -ss | awk '{print "KILL "$1";"}'| mysql
3
Fedir RYKHTIK
mysqladmin pr -u 'USERNAME' -p'PASSWORD' | awk '$2~/^[0-9]+/{print $2}' | xargs -i mysqladmin -u 'USERNAME' -p'PASSWORD' kill {}
2
user3721740

Мы можем сделать это с помощью MySQL Workbench. Просто выполните это:

kill id;

Пример:

kill 13412

Это удалит это. 

2
Aroon

Я недавно должен был сделать это, и я придумал это

-- GROUP_CONCAT turns all the rows into 1
-- @q:= stores all the kill commands to a variable
select @q:=GROUP_CONCAT(CONCAT('KILL ',ID) SEPARATOR ';')  
FROM information_schema.processlist 
-- If you don't need it, you can remove the WHERE command altogether
WHERE user = 'user';
-- Creates statement and execute it
PREPARE stmt FROM @q;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

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

2
Iberê

Я бы совместил bash и mysql:

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

Я использовал команду flush tables, чтобы убить все неактивные соединения, которые на самом деле массовая проблема.

0
Meltzer
#! /bin/bash
if [ $# != "1" ];then
    echo "Not enough arguments.";
    echo "Usage: killQueryByDB.sh <db_name>";
    exit;
fi;

DB=${1};
for i in `mysql -u <user> -h localhost ${DB} -p<password> -e "show processlist" | sed 's/\(^[0-9]*\).*/\1/'`; do
    echo "Killing query ${i}";
    mysql -u <user> -h localhost ${DB} -p<password> -e "kill query ${i}";
done;
0
Diego Andrés Díaz Espinoza

Иногда у меня есть некоторые процессы mysql зомби, которые не могут быть убиты (используя MAMP Pro). 

Сначала получите список всех процессов mysql:

ps -ax | grep mysql

Затем убейте каждого из них (замените processId первым столбцом в предыдущем результате команды):

kill -9 processId
0
Nico Prat

Если вы используете laravel, то это для вас: 

$query = "SHOW FULL PROCESSLIST";
    $results = DB::select(DB::raw($query));

    foreach($results as $result){
        if($result->Command == "Sleep"){
            $sql="KILL ". $result->Id;
            DB::select(DB::raw($sql));
        }
    }

Конечно, вы должны использовать этот use Illuminate\Support\Facades\DB; после вашего пространства имен. 

0
Ziaur Rahman

для языка Python, вы можете сделать это

import pymysql

connection = pymysql.connect(Host='localhost',
                             user='root',
                             db='mysql',
                             cursorclass=pymysql.cursors.DictCursor)

with connection.cursor() as cursor:
    cursor.execute('SHOW PROCESSLIST')
    for item in cursor.fetchall():
        if item.get('Time') > 200:
            _id = item.get('Id')
            print('kill %s' % item)
            cursor.execute('kill %s', _id)
    connection.close()
0
BohanZhang

Следующее работает отлично для меня:

echo "show processlist" | mysql | grep -v ^Id | awk '{print $1}' | xargs -i echo "KILL {}; | mysql"
0
Timon de Groot

Простым способом было бы перезапустить сервер mysql .. Откройте "services.msc" в Windows Run, выберите Mysql из списка. Щелкните правой кнопкой мыши и остановите службу. Затем снова запустите, и все процессы были бы уничтожены, кроме одного (зарезервированное соединение по умолчанию)

0
shashi009