翻译How To Kill MYSQL Queries - 如何杀掉 MySQL 查询
Posted 梦想橡皮擦
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了翻译How To Kill MYSQL Queries - 如何杀掉 MySQL 查询相关的知识,希望对你有一定的参考价值。
这个系列的博客将采用高水平的英文翻译实现。
如何杀掉 mysql 查询
当你想要杀掉 MySQL 进程或者查询的时候,可以用本篇博客展示的方法操作,而且效果非常好。
文章目录
查询进程列表
运行下述命令
show processlist;
该命令将展示所有连接到服务器的命令,结果集包括 thread IDs
, User
, Host
, DB
, Time
, Status
, Info
等内容
执行该命令前,需要确定是否有管理权限,否则仅展示当前权限下运行的查询。
关闭特定线程
如果你知道 Thread ID
,可以使用 kill
命令关闭特定的线程,命令如下
kill thread_id;
例如 thread ID
是 33,则命令如下所示:
kill 33;
使用 CONCAT
关闭多个 MySQL 进程
因为MySQL没有批量 kill
命令,所以你可以使用 concat
从 processlist
表生成相关命令。
有两个办法可以完成上述操作
方法一:
运行下述命令
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进程了。
- 手动复制进行删除
- 保存成文件,然后依次读取删除
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 翻译