Mysql 有些查询语句不合理, 或者其它一些特殊的原因会导致一个查询进程 Locked, 而如果多个相似的查询可能会因为表设计的不合理而跟着排在这个进程后面接着 Locked.
在这样的情况下, 我们就会需要, kill 这个进程, 而打通整个数据库的任督二脉:
kill [进程ID]
但是如果我们是在一个进程 Locked 很久之后才发现, 有大量的进程已经被 Locked 了, 那要如何批量 kill 这些进程呢, 其实也不复杂:
首先我们需要获得一个完整的锁定的进程列表, 本例中就是处理时间超过10秒钟的, 状态为locked 的操作, 我们就人为他是异常锁定的进程了, 因此我们实用以下语句查询出这些进程:
SELECT id FROM information_schema.processlist WHERE State = 'Locked' AND Time > 10;
接着我们拼接出 Kill 这些进程的语句
SELECT concat('KILL ', id, ';') FROM information_schema.processlist WHERE State = 'Locked' AND Time > 10;
然后我们将这些SQL导出到为外部文件
SELECT concat('KILL ', id, ';') FROM information_schema.processlist WHERE State = 'Locked' AND Time > 10 INTO OUTFILE '/tmp/killthem.sql';
最后我们再导入执行这个SQL文件
SOURCE /tmp/killthem.sql
注, SOURCE 导入文件, 整个文件路径是没有单引号引用的.
至此批量 kill processlist 的操作就完成了.