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

TIM*_*MEX 118 mysql database

因为我在那里看到了很多进程,而"时间"列显示了所有进程的大值.

Ang*_*dar 204

大规模杀戮操作可以节省 在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;
Run Code Online (Sandbox Code Playgroud)

参考

---------edit------------
Run Code Online (Sandbox Code Playgroud)

如果你不想存储在文件中,请存储在 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")
Run Code Online (Sandbox Code Playgroud)

  • 请记得参考来源:http://www.mysqlperformanceblog.com/2009/05/21/mass-killing-of-mysql-connections/ (11认同)
  • @ArtemGoutsoul但我不记得我曾参考过这个网站.这是我自己的做法. (2认同)

Mic*_*hař 103

你需要逐个杀死它们,MySQL没有任何大规模杀戮命令.您可以使用任何语言编写脚本,例如在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);
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 壳牌`for i in {994..1145}; 做mysql -uroot -p123456 -e"kill $ i"; done` (4认同)

小智 16

我还搜索了如何通过MySQL解析命令SHOW PROCESSLIST并以Shell中的单行结束:

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

您可以在awk命令之前运行grep来过滤特定的数据库名称.


Ecc*_*Oli 13

或者......在shell中......

service mysql restart
Run Code Online (Sandbox Code Playgroud)

是的,我知道,我很懒,但它也很方便.

  • 这是一个非常糟糕的想法...特别是如果你在内存上设置了表引擎,导致所有数据都将丢失...或者如果你使用innodb引擎类型,因为它会在重启时重做所有索引 (9认同)
  • 它还会杀死所有数据库上的所有进程 (7认同)

Mau*_*ani 11

它不会变得简单,只需在mysql提示符中执行它.

kill USER username;
Run Code Online (Sandbox Code Playgroud)

它会在提供的用户名下杀死所有进程.因为大多数人为了各种目的使用相同的用户,它的工作原理!

我在MariaDB上测试了这个,不确定mysql.

  • 我已经在MySQL 5.6.34提示符中尝试过:`mysql&gt; kill user root; 错误1064(42000):您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册以获取正确的语法,以在第1行的“ root”附近使用。可能您的答案仅是MariaDB特有的功能。 (4认同)
  • 在哪个版本的MySQL中存在?我没有在[MySQL 5.7参考](https://dev.mysql.com/doc/refman/5.7/en/kill.html)中看到它的文档;没有证据表明有可能被用户杀死:`KILL [CONNECTION | QUERY] processlist_id`。我在MySQL 5.6.34中尝试了您的查询,这被认为是语法错误。 (3认同)
  • 这对 Mysql 不起作用。请在发布与其他数据库系统相关的建议之前阅读... (3认同)

mik*_*esl 5

如果您没有information_schema:

__CODE__


小智 5

杀死所有选择查询

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


Ibe*_*erê 5

我最近需要这样做,并且我想到了这个

-- 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;
Run Code Online (Sandbox Code Playgroud)

这样,您无需使用单个命令即可存储到文件并运行所有查询。


Ste*_*ers 5

下面将创建一个简单的存储过程,该过程使用游标一个一个地杀死所有进程,当前正在使用的进程除外:

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 ;
Run Code Online (Sandbox Code Playgroud)

可以与SELECTs一起运行以显示之前和之后的过程,如下所示:

SELECT * FROM information_schema.processlist;
CALL kill_other_processes();
SELECT * FROM information_schema.processlist;
Run Code Online (Sandbox Code Playgroud)