Потому что я вижу там много процессов, а столбец "время" показывает большие значения для всех них.
Как я могу убить все процессы в Mysql "show processlist"?
Ответ 1
Вам нужно убивать их один за другим, у MySQL нет массивной команды kill. Вы можете script его на любом языке, например, в 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);
}
}
Ответ 2
Массовое убийство экономит время. Сделайте это в самой 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")
Ответ 3
Я также искал, как анализировать через MySQL команду SHOW PROCESSLIST и заканчивается однострочным в оболочке:
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 для фильтрации определенного имени базы данных.
Ответ 4
Войти в Mysql как admin:
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)
Ответ 5
Или... в оболочке...
service mysql restart
Да, я знаю, я ленив, но это может быть удобно.
Ответ 6
Теперь это не упростится, просто выполните это в приглашении MariaDB.
kill USER username;
Он уничтожит весь процесс под предоставленным именем пользователя. потому что большинство людей используют одного пользователя для всех целей, он работает!
Ответ 7
Если у вас нет information_schema:
mysql -e "show full processlist" | cut -f1 | sed -e 's/^/kill /' | sed -e 's/$/;/' ; > /tmp/kill.txt
mysql> . /tmp/kill.txt
Ответ 8
УБИТЬ ВСЕ ВЫБОРНЫЕ ЗАПРОСЫ
select concat('KILL ',id,';')
from information_schema.processlist
where user='root'
and INFO like 'SELECT%' into outfile '/tmp/a.txt';
source /tmp/a.txt;
Ответ 9
Вот решение, которое вы можете выполнить, не полагаясь на операционную систему:
ШАГ 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. Вызовите хранимую процедуру, указав ей имя пользователя базы данных, чьи процессы вы хотите убить. Вы можете переписать хранимую процедуру для фильтрации по другим критериям, если хотите.
CALL kill_user_processes('devdba');
Ответ 10
Далее будет создана простая хранимая процедура, которая использует курсор для уничтожения всех процессов один за другим, за исключением используемого в настоящее время процесса:
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;
-- build email list
IF proc_id <> CONNECTION_ID() THEN
KILL proc_id;
END IF;
END LOOP proc_id_cursor_loop;
CLOSE proc_id_cursor;
END$$
DELIMITER ;
Его можно запустить с помощью SELECT
, чтобы показать процессы до и после следующим образом:
SELECT * FROM information_schema.processlist;
CALL kill_other_processes();
SELECT * FROM information_schema.processlist;
Ответ 11
mysqladmin pr -u 'USERNAME' -p'PASSWORD' | awk '$2~/^[0-9]+/{print $2}' | xargs -i mysqladmin -u 'USERNAME' -p'PASSWORD' kill {}
Ответ 12
Мне недавно нужно было это сделать, и я придумал этот
-- 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;
Таким образом, вам не нужно хранить файлы и запускать все запросы с помощью одной команды.
Ответ 13
Это отрезало меня (MySQL server 5.5), чтобы убить все процессы MySQL:
mysql -e "show full processlist;" -ss | awk '{print "KILL "$1";"}'| mysql
Ответ 14
Простым способом будет перезапуск сервера mysql. Откройте "services.msc" в Windows Run, выберите Mysql из списка. Щелкните правой кнопкой мыши и остановите службу. Затем Запустите снова, и все процессы будут убиты, кроме одного (зарезервированное соединение по умолчанию)
Ответ 15
#! /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;
Ответ 16
Иногда у меня есть некоторые zombies mysql-процессы, которые нельзя убить (используя MAMP Pro).
Сначала получите список всех процессов mysql:
ps -ax | grep mysql
Затем убейте каждого из них (замените processId первым столбцом в предыдущем результате команды):
kill -9 processId
Ответ 17
Следующие отлично работали для меня:
echo "show processlist" | mysql | grep -v ^Id | awk '{print $1}' | xargs -i echo "KILL {}; | mysql"
Ответ 18
Я использовал команду flush tables
, чтобы убить все неактивные соединения, которые на самом деле представляют собой массовую проблему.
Ответ 19
Запрос 1 выберите concat ('KILL', id, ';') из information_schema.processlist, где user = 'username' в outfile '/tmp/a.txt';
Запрос 2 source a.txt
Это позволит вам убить все запросы в списке процессов для конкретного пользователя.