我在 pg_stat_activity 上使用以下查询来查找当前正在运行的查询:
SELECT pid, age(clock_timestamp(), query_start), usename, query, *
FROM pg_stat_activity
WHERE query != '<IDLE>' AND query NOT ILIKE '%pg_stat_activity%' and usename='<db_user>'
ORDER BY query_start desc;
我使用以下查询为该用户设置了 satement_timeout 为 30 秒:
ALTER ROLE <db_user> set statement_timeout = 30000
我验证这是通过为 db_user 打开一个新会话来设置的:
show statement_timeout;
statement_timeout|
-----------------|
30s |
我运行了这个查询,它按预期在 30 秒后超时。
SELECT pg_sleep(31);
SQL Error [57014]: ERROR: canceling statement due to statement timeout
但是,在此之后,当我运行第一个查询以查看正在运行的查询时,它也会向我显示超时查询
PID | 年龄 | 使用名称 | 询问 |
---|---|---|---|
9133 | 00:00:54.366638 | <数据库用户> | 犯罪 |
31551 | 00:01:49.70594 | <数据库用户> | ¶选择 pg_sleep(31) |
为什么查询 pg_stat_activity 时仍然显示超时查询。我希望由于这个查询已经终止,它不能出现在 pg_stat_activity 中。