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

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

Ответы [ 24 ]

3 голосов
/ 30 мая 2014

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

ШАГ 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');

2 голосов
/ 05 марта 2015
mysqladmin pr -u 'USERNAME' -p'PASSWORD' | awk '$2~/^[0-9]+/{print $2}' | xargs -i mysqladmin -u 'USERNAME' -p'PASSWORD' kill {}
2 голосов
/ 19 февраля 2018

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

kill id;

Пример:

kill 13412

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

2 голосов
/ 08 сентября 2015

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

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

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

1 голос
/ 26 октября 2018

Я бы совмещал 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
0 голосов
/ 05 декабря 2017

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

0 голосов
/ 03 ноября 2017

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

echo "show processlist" | mysql | grep -v ^Id | awk '{print $1}' | xargs -i echo "KILL {}; | mysql"
0 голосов
/ 19 октября 2017

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

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

ps -ax | grep mysql

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

kill -9 processId
0 голосов
/ 13 августа 2014

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

0 голосов
/ 27 марта 2018

для языка 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...