mysql> show processlist;
+----+------+-----------+------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+------+---------+------+-------+------------------+
| 7 | root | localhost | yy | Sleep | 154 | | NULL |
| 8 | root | localhost | NULL | Query | 0 | NULL | show processlist |
+----+------+-----------+------+---------+------+-------+------------------+
2 rows in set (0.00 sec)
mysql> kill 7
-> ;
mysql> show processlist;
+----+------+-----------+------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+------+---------+------+-------+------------------+
| 8 | root | localhost | NULL | Query | 0 | NULL | show processlist |
+----+------+-----------+------+---------+------+-------+------------------+
1 row in set (0.00 sec)
show processlist / show full processlist 可以看到当前的process信息,
如果想要kill某些process,只能复制它的Id(thread id),然后kill, 每次只能kill一个。
如果要kill掉所有运行时间超过10秒的语句,这样搞起来就太麻烦了。
今天介绍个简单的办法,主要是通过INFORMATION_SCHEMA数据库来实现。
其中的PROCESSLIST表记录了process的信息。
找出运行时间超过10秒的process的ID。
SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST
WHERE COMMAND = 'Query' AND TIME > 10;
这样似乎太莽撞了,有些进程不应该被kill的,比如负责replication的。。。
需要过滤一下:
SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST
WHERE COMMAND = 'Query' AND TIME > 10
AND ID != CONNECTION_ID()
AND USER != 'root'
AND COMMAND != 'Binlog Dump'
AND STATE NOT REGEXP '(slave|relay|event)'
你也可以根据实际情况加入自己的过滤条件。
然后比较悲剧的是 kill 只能接受一个id做为参数。
只好生成所有的kill语句了:
mysql> SELECT CONCAT('KILL ',ID,';')
FROM INFORMATION_SCHEMA.PROCESSLIST
WHERE USER = 'webs'
AND COMMAND = 'Query'
AND TIME > 10
INTO OUTFILE '/tmp/kill_list.txt';
然后再导入: