批量终止行为不当的 MySQL 查询

批量终止行为不当的 MySQL 查询

如何终止大量 MySQL 查询?以下是好方法

mysql> SELECT concat('KILL ',id,';') FROM information_schema.processlist WHERE user='root' INTO OUTFILE '/tmp/a.txt';
mysql> source /tmp/a.txt;

除了在 MySQL 管理员 GUI 中单击它们之外,还有其他方法吗?

答案1

抄袭最佳评论Percona 对此的看法

评论 4:Robert Wultsch

我更喜欢以下方法,因为它会以多线程方式杀死它们......(有时杀死单个查询可能需要一段时间)

对于 $(mysql -uroot -pPASS -e 'show processlist' | grep 'search_term' | awk '{print $1}') 中的 i;执行

mysql -uroot -pPASS -e “kill $i” &

完毕

评论 8:Shlomi Noach

一个INFORMATION_SCHEMA.PROCESSLIST 存储过程复制起来有点冗长。

评论 16:布莱恩

如果您的 MySQL 版本中不存在 information_schema.processlist,则可以使用 Linux 脚本执行此操作:

/bin/bash #!/bin/bash

对于'mysqladmin -u root -prootpwd 进程列表|awk 中的每个
'{打印 $2、$4、$8}' | grep $dbname | grep $dbuser | awk '{打印 $1}'`;

执行 mysqladmin -u root -prootpwd kill $each;

完毕

评论 21:安德鲁·沃森

我这样做:

mysqladmin proc | grep Sleep | sort -r -n -k6 | awk {'print $1; '} | xargs mysqladmin kill

或者类似的东西……


作为Dan C 在回答这个问题时提到,修剪 SELECTS 比在流中终止写入命令要安全得多,因为您可能会丢失数据完整性和/或外键。

答案2

另一种解决方案是使用以下方法Digg 描述,即自动删除任何需要超过指定时间才能完成的 SELECT 查询。一般来说,您只想删除 SELECT 查询,因为它们是只读的,不会影响应用程序的数据完整性。

您可以使用以下两个实用程序来实现此自动化:数据库mon.plmkill 是名为顶部

答案3

我用它来终止 MySQL 5.5 数据库服务器上所有休眠查询:

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

答案4

最简单的方法是从壳中杀死它们,例如

mysqladmin proc | grep Sleep | awk '{print $2}' | xargs -L1 mysqladmin kill 

如果仍有问题,请通过以下查询检查详细信息:

mysql -e "SHOW engine innodb status\G"

从 MySQL 中,尝试以下基于以下帖子的代码@Shlomi,你可以使用服务器游标创建存储过程,例如:

DELIMITER $$

DROP PROCEDURE IF EXISTS test.kill_user_queries$$
CREATE PROCEDURE test.kill_user_queries (kill_user_name VARCHAR(16) CHARSET utf8)
SQL SECURITY INVOKER
BEGIN
DECLARE query_id INT;
DECLARE iteration_complete INT DEFAULT 0;
DECLARE select_cursor CURSOR FOR SELECT id FROM INFORMATION_SCHEMA.PROCESSLIST WHERE user=kill_user_name;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET iteration_complete=1;

OPEN select_cursor;
cursor_loop: LOOP
FETCH select_cursor INTO query_id;
IF iteration_complete THEN
LEAVE cursor_loop;
END IF;
KILL QUERY query_id;
END LOOP;
CLOSE select_cursor;

END$$

DELIMITER ;

还有一种古老的剧本叫做mypgrep.py由 Google 提供。

相关内容