以postgres实例中的以下块为例:
postgres=> SELECT pid, query_start from pg_stat_activity ORDER BY pid;
pid | query_start
-------+-------------------------------
374 |
375 |
376 |
377 |
380 |
1185 | 2023-03-07 00:06:49.97674+00
1222 | 2023-03-07 00:06:56.795915+00
3449 | 2023-03-06 21:57:26.409735+00
3518 | 2023-03-07 00:06:57.661874+00
17950 | 2023-03-07 00:06:57.590964+00
17951 | 2023-03-07 00:06:57.659922+00
17952 | 2023-03-07 00:06:57.659469+00
17953 | 2023-03-07 00:06:57.656676+00
17954 | 2023-03-07 00:06:57.647601+00
(14 rows)显然,PID 3449的查询被卡住了,它挂了两个多小时。我不想用pg_backend_terminate(pid)手动清理卡住的查询。
Postgres会自动清除卡住的查询吗?如果是,什么时候?我能否将Postgres配置为在一定的间隔长度之后自动终止PID?
发布于 2023-03-07 01:22:16
默认情况下,PostgreSQL不会自动终止滞留的查询。它依赖于管理员使用pg_terminate_backend()或pg_cancel_backend()手动干预和终止它们。
但是,PostgreSQL确实提供了一种使用statement_timeout参数为查询设置超时的方法。设置时,如果查询运行时间超过指定的超时时间,PostgreSQL将自动终止查询并释放其资源。
可以在会话级别或全局设置此参数。例如,若要全局将超时设置为1小时,可以将以下行添加到postgresql.conf文件中:
statement_timeout = 3600000不建议在statement_timeout中设置
postgresql.conf,因为它会影响所有会话。
或者,可以通过运行以下SQL命令,在每个会话的基础上设置超时:
SET statement_timeout = '1h';请注意,将超时设置得太低会导致合法查询过早终止。您应该将其设置为适合您的用例的值。
参考文献:
https://dba.stackexchange.com/questions/324450
复制相似问题