如何终止大量 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 对此的看法:
我更喜欢以下方法,因为它会以多线程方式杀死它们......(有时杀死单个查询可能需要一段时间)
对于 $(mysql -uroot -pPASS -e 'show processlist' | grep 'search_term' | awk '{print $1}') 中的 i;执行
mysql -uroot -pPASS -e “kill $i” &
完毕
一个INFORMATION_SCHEMA.PROCESSLIST 存储过程复制起来有点冗长。
如果您的 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; 完毕
我这样做:
mysqladmin proc | grep Sleep | sort -r -n -k6 | awk {'print $1; '} | xargs mysqladmin kill
或者类似的东西……
作为Dan C 在回答这个问题时提到,修剪 SELECTS 比在流中终止写入命令要安全得多,因为您可能会丢失数据完整性和/或外键。
答案2
答案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 提供。