你如何杀死大量的MySQL查询? 这是一个好方法 :
mysql> SELECT concat('KILL ',id,';') FROM information_schema.processlist WHERE user='root' INTO OUTFILE '/tmp/a.txt'; mysql> source /tmp/a.txt;
任何人除了在MySQLpipe理员graphics界面中点击他们死亡?
为了摆脱Percona对此的最好评价:
评论4:罗伯特Wultsch
我更喜欢以下内容,因为它会以multithreading方式杀死它们…(有时候,杀死一个查询可能需要一段时间)
(mysql -uroot -pPASS -e'show processlist'| grep'search_term'| awk'{print $ 1}'); 做
mysql -uroot -ppass -e“kill $ i”&
DONE
评论8:Shlomi Noach
一个INFORMATION_SCHEMA.PROCESSLIST存储过程有点详细的复制。
评论16:布莱恩
如果您的MySQL版本中不存在information_schema.processlist,那么这个工作在linux脚本中:
#!/斌/庆典
对于`mysqladmin -u root -prootpwd processlist |中的每一个 AWK
'{print $ 2,$ 4,$ 8}'| grep $ dbname | grep $ dbuser | awk'{print $ 1}';
做mysqladmin -u root -prootpwd kill $ each;
DONE
评论21:安德鲁沃森
我这样做:
mysqladmin proc | grep睡眠| sort -r -n -k6 | awk {'print $ 1; '} | xargs mysqladmin杀人
或者是这个效果
正如Dan C在回答这个问题时提到的那样 ,修剪SELECTS比杀死写入命令更安全,因为您可能会丢失数据完整性和/或外键。
另一种解决scheme是使用Digg描述的方法,即自动删减任何花费比分配的时间段更长的SELECT查询来完成。 一般来说,您只需要删除SELECT查询,因为它们是只读的,不应该影响应用程序的数据完整性。
你可以使用两个这样的工具来自动化这个工具 ,它们是dbmon.pl和mkill,它是一个名为mtop的包的一部分 。
我用它来杀死MySQL 5.5数据库服务器上的所有睡眠查询:
mysql -e "show full processlist;" -ss | grep Sleep | awk '{print "KILL "$1";"}' | mysql
最简单的就是把它们从壳里杀死,例如
mysqladmin proc | grep Sleep | awk '{print $2}' | xargs -L1 mysqladmin kill
如果仍有问题,请通过以下查询检查详细信息:
mysql -e "SHOW engine innodb status\G"
从MySQL中,尝试下面的代码根据@Shlomi发布的post ,可以使用服务器游标创build一个存储过程,例如:
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 ;
Google还有一个名为mypgrep.py的旧脚本。