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

时间:2009-12-14 22:06:14

标签: mysql database

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

25 个答案:

答案 0 :(得分:195)

大规模杀戮操作可以节省时间。在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;

Reference

---------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")

答案 1 :(得分:99)

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

答案 2 :(得分:16)

我还搜索了如何通过MySQL解析命令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 将仅从第二列解析数字(线程ID)并生成MySQL KILL命令;
  • 最后对 mysql 的最后一次调用将执行传递的命令。

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

答案 3 :(得分:12)

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

service mysql restart

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

答案 4 :(得分:11)

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

kill USER username;

它将在提供的用户名下终止所有进程。因为大多数人为了各种目的使用同一个用户,所以它有效!

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

答案 5 :(得分:5)

如果您没有information_schema:

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

答案 6 :(得分:5)

以下将创建一个简单的存储过程,该过程使用游标逐个终止所有进程,但当前正在使用的进程除外:

storage

可以使用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 ; 运行它来显示之前和之后的过程,如下所示:

SELECT

答案 7 :(得分:4)

以admin身份登录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)

答案 8 :(得分:4)

杀死所有选择查询

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 :(得分:3)

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

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

答案 10 :(得分:3)

这段剪辑为我(MySQL服务器5.5)工作以杀死所有MySQL进程:

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

答案 11 :(得分:2)

我们可以通过MySQL Workbench来实现。只需执行此操作:

kill id;

示例:

kill 13412

那将删除它。

答案 12 :(得分:2)

我最近需要这样做,我想出了这个

-- 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 :(得分:2)

mysqladmin pr -u 'USERNAME' -p'PASSWORD' | awk '$2~/^[0-9]+/{print $2}' | xargs -i mysqladmin -u 'USERNAME' -p'PASSWORD' kill {}

答案 14 :(得分:1)

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

答案 15 :(得分:0)

如果您使用的是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;

答案 16 :(得分: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()

答案 17 :(得分:0)

如果正在运行的进程不是您的,则 Kill 不起作用。我合并了其中一些解决方案并对其进行了扩展以创建一个更简单的解决方案(至少对我而言)。

<ul>
<li>likkebamser</li>
<li>Heldige Lakridser</li>
<li>Lakridser</li>
</ul>

答案 18 :(得分:0)

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

答案 19 :(得分:0)

以下对我有用:

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

答案 20 :(得分:0)

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

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

ps -ax | grep mysql

接下来使用(用上一个命令结果中的第一列替换processId)来杀死它们中的每一个:

kill -9 processId

答案 21 :(得分:0)

in2csv -k items customers-page-1.json > customers-page-1.csv

答案 22 :(得分:0)

一种简单的方法是重启mysql服务器.. 在Windows Run中打开“services.msc”,从列表中选择Mysql。右键单击并停止服务。然后再次启动,除了一个(默认保留连接)

之外,所有进程都将被终止

答案 23 :(得分:-1)

检查流程清单: -

show processlist;

获取进程ID运行

kill processid;

答案 24 :(得分:-4)

查询1 从information_schema.processlist中选择concat(&#39; KILL&#39;,id,&#39;;&#39;),其中user =&#39; username&#39;进入outfile&#39; /tmp/a.txt' ;;

查询2 来源a.txt

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