如何杀死Mysql中的所有进程“show processlist”?

因为我在那里看到很多stream程,“时间”栏显示了所有这些stream程的重要价值。

你需要逐个杀掉它们,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); } } 

大屠杀操作节省时间。 在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") 

我也search了如何通过MySQLparsing命令SHOW PROCESSLIST,并以Shell中的单行结束:

 mysqladmin processlist -u <USERNAME> -p<PASSWORD> | \ awk '$2 ~ /^[0-9]/ {print "KILL "$2";"}' | \ mysql -u <USERNAME> -p<PASSWORD> 
  • mysqladmin processlist将打印一个带有线程id的表;
  • awk将从第二列仅parsing数字(线程ID)并生成MySQL KILL命令;
  • 最后最后一次调用mysql将执行传递的命令。

您可以在awk命令之前运行grep来筛选特定的数据库名称。

以pipe理员身份login到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) 

或…在壳中…

 service mysql restart 

是的,我知道,我很懒,但也可以很方便。

这并不简单,只需在MySQL提示符下执行。

 kill USER username; 

它会杀死提供的用户名下的所有进程。 因为大多数人使用同一个用户的所有目的,它的作品!

如果您没有information_schema:

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

杀死所有select查询

 select concat('KILL ',id,';') from information_schema.processlist where user='root' and INFO like 'SELECT%' into outfile '/tmp/a.txt'; source /tmp/a.txt; 

以下是不依赖操作系统就可以执行的解决scheme:

步骤1:创build一个存储过程。

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

下面将创build一个简单的存储过程,使用游标逐个除去当前正在使用的进程来终止所有进程:

 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; 

我最近需要做到这一点,我想出了这个

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

这样,您不需要使用单个命令来存储和运行所有查询。

这为我剪断(MySQL服务器5.5),以杀死所有的MySQL进程:

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

一个简单的方法是重新启动MySQL服务器。打开Windows中的“services.msc”运行,从列表中selectMysql。 右键单击并停止服务。 然后再次启动,所有的进程将被杀死,除了一个(默认的保留连接)

 #! /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; 

有时我有一些僵尸mysql进程不能被杀死(使用MAMP Pro)。

首先获取所有mysql进程的列表:

 ps -ax | grep mysql 

接下来杀掉它们中的每一个(用前一个命令结果中的第一列代替processId):

 kill -9 processId 

以下工作对我很好:

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

查询1从information_schema.processlist中selectconcat('KILL',id,';')where user ='username'into outfile'/tmp/a.txt';

查询2源a.txt

这将使您能够杀死特定用户在show processlist中的所有查询。