当前位置:C++技术网 > 资讯 > mysql指定条件批量杀死线程的方法

mysql指定条件批量杀死线程的方法

更新时间:2019-01-11 11:11:34浏览次数:1+次

    在处理数据库异常的时候,有时候需要将数据库中相关的进程线程杀掉,以免死锁或者睡眠导致大量的数据库操作卡死。一般情况下,我们使用:

show processlist
    来查询正在运行的进程列表。不过这种查法却无法进行过滤,非常不好用。
    如果想指定条件来过滤相关的进程列表并且批量杀死进程线程,怎么办呢?
    对于这个需求,我们分两步来做:
1.指定条件过滤进程列表
    使用上面的查询是无法过滤的。不过processlist的数据都是存储在系统数据库information_schema的PROCESSLIST表里的。自然而然,我们就可以直接查表来过滤数据了。查表的方法和普通的数据库的表是一样的。这里就不多说了。
    下面给一个示例:
select * from information_schema.processlist where Command='Sleep'
    此语句可以查询所有进入睡眠状态的进程线程。语句的写法和普通的表是一样的。这个表有ID、USER、HOST、DB、COMMAND、TIME、STATE、INFO一共8个字段。我们可以自由的过滤。
2.批量杀死进程线程
    上一步我们能够根据指定条件过滤出所有的符合要求的进程,那么这一步就需要将这些线程杀死。如果只是杀死某个线程,我们使用如下语句:
kill 进程ID;
    进程ID就是上一步说的8个字段里的ID。如果要杀死多个线程,我们多写几个这样的kill就行了。但是如果太多了,手打也是很费时间的事情。所以我们要想个办法来自动形成需要的格式。
    自然而然,我们就可以想到字符串格式化。我们将查出来的ID和指定的字符串拼接起来,得到指定的一列数据,然后复制出来这一列数据就是我们需要的一组要杀掉的线程的语句,一次性执行就可以了。
    mysql拼接字符串的函数是concat,按照顺序依次传入多个字符串或字段名,就可以将字符串和字段值进行拼接。
    下面是示例语句:
select concat('kill ',id,';') from information_schema.processlist where Command='Sleep'
    执行完此语句后,就得到一列数据。结果如下:
kill 5872184;
kill 5872183;
kill 5872172;
kill 5872171;
kill 5872170;
kill 5872169;
kill 5872168;
kill 5872167;
... ...
    我们直接将这一个字段整体复制,然后拿去执行一下就可以了。因为有分号分隔,所以可以挨个去执行,这样执行完后就将所有的线程杀死了。