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)
我有很多后台作业在排队同一个查询。
我一直遇到他们卡住的情况,我想以某种简单的方式终止非常长的 运行 查询,这不会破坏整个数据库。
如何使用查询来执行此操作?
假设我的查询如下,我想杀死任何 运行 超过 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)