我想杀死的查询正在运行超过2个小时的自动方式。
我尝试创建如下触发器
create or replace function stop_query()
RETURNS trigger
language plpgsql
as $$
begin
with pid_tbl as
(
SELECT
pid
FROM pg_stat_activity
WHERE (now() - pg_stat_activity.query_start) > interval '120 minutes';
)
select * from pid_tbl;
SELECT pg_cancel_backend(var_pid);
end;$$
CREATE TRIGGER stop_query
FOR EACH ROW EXECUTE FUNCTION stop_query();
请告诉我我如何才能做到这一点。有没有任何方法,我可以做到这一点没有写函数触发器
1条答案
按热度按时间disho6za1#
你根本不需要这个触发器,正如我在评论中提到的,它应该足以让你运行以下查询之一:
他们都set的**
statement_timeout
**设置,默认情况下0
(意思是"没有限制")到'2 h'
(这只是代表"2小时").最好只应用于特定的上下文,它是需要的,即对于一个特定的用户,往往运行查询,你不想挂起太长时间.文件:
语句超时(整数)
中止花费的时间超过指定时间的任何语句。如果log_min_error_statement设置为ERROR或更小,则还将记录超时的语句。如果指定此值时没有单位,则以毫秒为单位。值为零(默认值)时禁用超时。
超时是从命令到达服务器到服务器完成该命令之间的时间。如果在一条简单查询消息中出现多条SQL语句,则超时将分别应用于每条语句。(PostgreSQL 13之前的版本通常将超时视为应用于整个查询字符串。)在扩展查询协议中,当任何查询相关消息(Parse、Bind、Execute、Describe)到达,并通过完成Execute或Sync消息来取消。
建议不要在postgresql. conf中设置statement_timeout,因为这会影响所有会话。
如果您尝试使用不受支持的单位,您将得到一个提示:
错误:参数"statement_timeout"的值无效:"2小时"
提示:此参数的有效单位为"us"、"ms"、"s"、"min"、"h"和"d"。
它们分别是微秒、毫秒、秒、分、小时和天。