postgres - 如何终止所有匹配特定查询的长 运行 查询?

postgres - how to kill all long running queries that match a particular query?

我有很多后台作业在排队同一个查询。

我一直遇到他们卡住的情况,我想以某种简单的方式终止非常长的 运行 查询,这不会破坏整个数据库。

如何使用查询来执行此操作?

假设我的查询如下,我想杀死任何 运行 超过 60 分钟的查询

select * from some_big_table;

这是我能想到的最好的。请注意,我 运行 在 mac

首先,我在命令行生成了查询的 MD5。我这样做是为了简化查询的外观,以确保我只匹配我的目标查询,并避免在我输入错误的查询时“sql 注入”我自己。

# on linux, use 'md5sum' instead.
$ echo -n 'select * from some_big_table;' | md5
65007f37ff78f1e66645105412430b7c

然后我只是使用子选择来过滤掉任何其他未 运行 超过 60 分钟的查询。

SELECT pg_cancel_backend(pid)
FROM   pg_stat_activity
WHERE  
       now() - pg_stat_activity.query_start >= interval '60 minutes' AND
       md5(query) = '65007f37ff78f1e66645105412430b7c' AND    
       state = 'active';

这似乎工作正常

 pg_cancel_backend
-------------------
 t
 t
(2 rows)