翻译How To Kill MYSQL Queries - 如何杀掉 MySQL 查询

Posted 梦想橡皮擦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了翻译How To Kill MYSQL Queries - 如何杀掉 MySQL 查询相关的知识,希望对你有一定的参考价值。

这个系列的博客将采用高水平的英文翻译实现。

如何杀掉 mysql 查询

当你想要杀掉 MySQL 进程或者查询的时候,可以用本篇博客展示的方法操作,而且效果非常好。

文章目录

查询进程列表

运行下述命令

show processlist;

该命令将展示所有连接到服务器的命令,结果集包括 thread IDsUserHostDBTimeStatusInfo 等内容

执行该命令前,需要确定是否有管理权限,否则仅展示当前权限下运行的查询。

关闭特定线程

如果你知道 Thread ID ,可以使用 kill 命令关闭特定的线程,命令如下

kill thread_id;

例如 thread ID 是 33,则命令如下所示:

kill 33;

使用 CONCAT 关闭多个 MySQL 进程
因为MySQL没有批量 kill 命令,所以你可以使用 concatprocesslist 表生成相关命令。
有两个办法可以完成上述操作
方法一:
运行下述命令

SELECT GROUP_CONCAT(CONCAT('KILL ',id,';') SEPARATOR ' ') FROM information_schema.processlist WHERE user <> 'system user'; 

该命令会关闭所有 MySQL 查询。

方法二:
processlist 创建一个子表

SELECT CONCAT('KILL ',id,';') AS kill_list FROM information_schema.processlist WHERE user='root' AND info = 'SELECT * FROM processlist';

上述命令输入结果为:

+------------------------+
| kill_list              |
+------------------------+
| KILL 1;                |
| KILL 2;                |
| KILL 3;                |
| KILL 4;                |
+------------------------+

此时就可以使用下面的两个办法来关闭MySQL进程了。

  1. 手动复制进行删除
  2. 保存成文件,然后依次读取删除
SELECT CONCAT('KILL ',id,';') AS run_this FROM information_schema.processlist WHERE user='root' AND info = 'SELECT * FROM processlist' INTO OUTFILE '/tmp/kill_list.txt' 

上述命令会创建一个 kill_list 的文本文件,请注意删除文件的第一行,因为那不是有效的 MySQL 命令。
现在你可以在 MySQL中运行该文件了,它将执行文件中的所有语句,从而关闭所有线程。

mysql -uroot -pyourpassword < /tmp/kill_list.txt

关闭全部进程

你可以使用如下命令关闭所有进程

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

使用 php 脚本

用 PHP 关闭所有进程的脚本代码如下所示:

$result = mysql_query("SHOW FULL PROCESSLIST");
while ($row=mysql_fetch_array($result))
	$process_id=$row["Id"];
 	if ($row["Time"] > 10 ) 
  		$sql="KILL $process_id";
  		mysql_query($sql);
	

使用存储过程关闭当前进程

我们可以创建一个存储过程,逐个关闭MySQL进程,并且不关闭当前正在使用的进程。

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 ; 

调用存储过程

CALL kill_other_processes();

使用存储过程关闭特定用户进程

可以创建一个存储过程,该存储过程可以终止某个特定用户的所有进程。

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 ; 

通过传入用户名参数关闭进程,假设用户是 bob ,你可以使用:

CALL kill_user_processes('bob')

到现在为止,你应该已经发现了如果想要终止 MySQL 查询,进程或者线程, show processlist 非常有用,并且 MySQL 没有一个命令可以关闭所有进程,所以本文围绕这个编写,希望对你有帮助。

原文地址:https://nestify.io/blog/how-to-kill-mysql-queries/

以上是关于翻译How To Kill MYSQL Queries - 如何杀掉 MySQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

How To Kill All SPID In Database or Multiple Databases In Sql Server

[翻译] ORMLite document -- How to Use Part

[翻译] ORMLite document -- How to Use Part

[特征选择] DIscover Feature Engineering, How to Engineer Features and How to Get Good at It 翻译

翻译 GITHUB上HOW TO BE A GOOD PROGRAMMER

翻译 Spring Boot How To