postgresql 自动终止长时间运行的查询

xqkwcwgp  于 2022-12-29  发布在  PostgreSQL
关注(0)|答案(1)|浏览(431)

我想杀死的查询正在运行超过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();

请告诉我我如何才能做到这一点。有没有任何方法,我可以做到这一点没有写函数触发器

disho6za

disho6za1#

你根本不需要这个触发器,正如我在评论中提到的,它应该足以让你运行以下查询之一:

SET LOCAL   statement_timeout='2 h';--applies only until the end of the current transaction within the current session
SET SESSION statement_timeout='2 h';--only in the current session/connection
ALTER ROLE     your_user_name SET statement_timeout='2 h';--all new sessions of this user
ALTER DATABASE your_db_name   SET statement_timeout='2 h';--all new sessions on this db
ALTER SYSTEM                  SET statement_timeout='2 h';--all new sessions on all dbs on this system

他们都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"。
它们分别是微秒、毫秒、秒、分、小时和天。

相关问题