如何杀死Mysql“显示进程列表”中的所有进程?


120

因为我在那里看到很多过程,所以“时间”列显示了所有过程的重要价值。


您也可以重新启动mysqld,例如,sudo service mysqld restart
philfreo 2011年

Answers:


108

您需要一个一个地杀死它们,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);
  }
}

那是一个好主意。Lemme尝试将其转换为cron上的shell脚本...!
M.

4
壳牌for i in {994..1145}; do mysql -uroot -p123456 -e "kill $i" ; done
zhuguowei

mysql -u -p -e“显示进程列表;” | grep睡眠| awk'{print $ 1}'| 同时阅读LINE;做mysql -u -p -e“ kill $ LINE”; 完成
user3770797

213

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


2
@ArtemGoutsoul,但我不记得我提到了这个网站。这是我自己的趋势。
Angelin Nadar 2012年

@JanusTroelsen,但我的回答是12
Angelin Nadar

1
@Angelin Nadar谢谢!
银色之光

1
@ShankarDamodaran SURE
Nadar

16

我还搜索了如何通过MySQL解析命令SHOW PROCESSLIST并在Shell中以单线结尾:

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

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


13

或者...在外壳...

service mysql restart

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


10
这是一个非常糟糕的主意……特别是如果您在内存上设置了表引擎,则将导致所有数据丢失……,或者如果您使用innodb引擎类型,则将在重启时重做所有索引
HellBaby

8
它还会杀死所有数据库上的所有进程
DiegoAndrésDíazEspinoza

10

然后,它变得不那么简单了,只需在mysql提示符下执行即可。

kill USER username;

它将杀死提供的用户名下的所有进程。因为大多数人出于同一目的使用同一用户,所以它可行!

我已经在MariaDB上测试过此数据库,但不确定关于mysql。


3
在哪个版本的MySQL中存在?我没有在MySQL 5.7参考中看到它;没有证据表明有可能被用户杀死:KILL [CONNECTION | QUERY] processlist_id。我在MySQL 5.6.34中尝试了您的查询,这被认为是语法错误。
Birchlabs

4
我已经在MySQL 5.6.34提示符中尝试过此操作: mysql> kill user root; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'root' at line 1 可能您的答案仅是MariaDB特有的功能。
Birchlabs

这不适用于Mysql。在发布与其他数据库系统相关的建议之前,请先阅读...
RyanH '19

7

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

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;

6

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

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

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


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;

5

如果您没有information_schema:

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

4

以管理员身份登录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)

19
这不是问题的答案。在这里,您正在杀死一个进程,而问题是如何立即杀死进程。
赫里斯托(Hristo Petev)2014年

@ badbod99我最终在这里寻找如何杀死mysql进程,这个答案对我有帮助,所以我投票了。
Bogdan

3

这个片段对我有用(MySQL服务器5.5)杀死了所有MySQL进程:

mysql -e "show full processlist;" -ss | awk '{print "KILL "$1";"}'| mysql

3

我会结合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

2

您可以在不依赖操作系统的情况下执行以下解决方案:

步骤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
mysqladmin pr -u 'USERNAME' -p'PASSWORD' | awk '$2~/^[0-9]+/{print $2}' | xargs -i mysqladmin -u 'USERNAME' -p'PASSWORD' kill {}

1
嘿。不知道您是机器人,社区还是人类,但是无论如何,如果您添加一些文字来解释此代码行的内容以及它如何解决当前问题,那将是很好的选择?
费利克斯·加侬-格雷尼尔

1
添加了-u和-p以授予用户访问权限...工作正常!
圣约翰勋爵

2

我们可以通过MySQL Workbench做到这一点。只需执行以下命令:

kill id;

例:

kill 13412

那将删除它。


听起来更好的答案,因为上面没有提到语言。
DeshDeep Singh '18

0

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


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

有时我有一些无法杀死的僵尸mysql进程(使用MAMP Pro)。

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

ps -ax | grep mysql

接下来用(将processId替换为先前命令结果中的第一列)杀死其中的每个人:

kill -9 processId

0

以下对我非常有用:

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

0

我使用该命令flush tables杀死了实际上是质量问题的所有非活动连接。


1
不起作用。刷新桌子,但保持睡眠功能活跃
gtryonp

0

对于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()

-1

如果您使用的是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;在命名空间之后使用它。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.