mysql 有选择地kill process 长时间的sql

本文介绍了一种利用MySQL INFORMATION_SCHEMA.PROCESSLIST表来查找并批量终止运行时间过长的查询的方法。通过构造SQL语句筛选出符合条件的进程ID,并生成一系列KILL命令来终止这些查询,同时提供了一些排除关键进程的过滤条件。

mysql 有选择地kill process


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';
然后再导入:


注意下面这行语句不是以分号结尾的
mysql> \. /tmp/kill_list.txt
Query OK, 0 ROWS affected (0.00 sec)
虽然现在智能多了,但是这样搞一回也还是比较麻烦的。
可以试试看 Percona Toolkit里面的 pt-kill, 祝你们好运。

### 如何批量终止数据库连接或进程 在 MySQL 数据库中,可以通过 `KILL CONNECTION` 或者 `KILL QUERY` 命令来终止特定的查询或会话。为了实现批量终止多个连接或进程的操作,通常需要结合 SQL 查询获取目标会话的信息并动态生成相应的命令。 #### 获取当前活跃会话信息 首先,可以利用以下 SQL 查询来查看当前所有的连接及其相关信息: ```sql SELECT id, user, host, db, command, time, state, info FROM information_schema.processlist; ``` 此查询返回的结果包含了每个连接的唯一标识符 (`id`)、用户名称 (`user`)、主机地址 (`host`) 等重要字段[^1]。 #### 动态生成 KILL 语句 基于上述查询结果,可以根据某些条件筛选出需要被杀死的目标会话,并构建对应的 `KILL CONNECTION` 命令。例如: 假设我们希望根据某个用户的连接全部关闭,则可以用如下脚本完成这一需求: ```bash mysql -u root -p -e "SELECT CONCAT('KILL ', id, ';') AS kill_command FROM information_schema.processlist WHERE user='target_user';" | mysql -u root -p ``` 这里需要注意的是,在实际生产环境中应当谨慎操作此类命令以免误伤正常业务流程中的合法请求。 对于 PostgreSQL 来说,存在类似的机制但是采用了不同的命名约定以及行为定义。比如使用 `pg_terminate_backend(pid)` 函数可以直接结束指定 PID 对应的后端进程;而如果只是想中断正在进行中的事务而不完全切断链接则可以选择调用 `pg_cancel_backend(pid)` 方法[^2]。 另外值得注意的一点是在 Oracle 数据库里虽然没有直接提供像MySQL那样的简单语法来做这件事儿,不过它有一个叫做 Process Monitor 的内部组件专门用来监控和清理那些意外崩溃掉的服务程序实例或者是人为下达指令要求销毁的对象实体们。当任何一个服务进程非正常退出之后,这个守护线程就会自动介入进来做必要的善后工作比如说更新数据字典状态标记位呀之类的动作[^3]。 最后提醒一下大家,在执行任何大规模删除之前最好先做好充分准备——确认好哪些是要保留下来的合法流量源地址范围列表之类的东西以便于后续排查问题时候能够快速定位到真正有问题的那个部分上去而不是一刀切地把所有东西都给干掉了哦! 同时也可以考虑建立一套黑名单管理系统用于记录反复出现问题的历史记录从而达到预防的目的[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值