pg_stat_activity 一直显示由于 statement_timeout 而超时的查询

pg_stat_activity keeps showing the query which has timeout due to statement_timeout

我在 pg_stat_activity 上使用以下查询来查找当前 运行ning 的查询:

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

然而在这之后,当我 运行 第一个查询查看哪些查询是 运行ning 时,它也显示了超时查询

pid 年龄 用户名 查询
9133 00:00:54.366638 提交
31551 00:01:49.70594 ¶SELECT pg_sleep(31)

为什么在查询pg_stat_activity时仍然显示超时查询。我希望由于此查询已终止,因此它一定不会出现在 pg_stat_activity.

query 列中,您会看到该连接上的最后一个查询。这确实 暗示查询处于活动状态。检查 pg_stat_activitystate 列 – 它可能是 idle,因为查询已终止。

您的监控查询已经过时了。在 9.1 版中,“”最后一次用作“查询”字段中空闲查询的标记。在比那个更新的版本中,有一个单独的“状态”列,在这种情况下将显示 'idle in transaction (aborted)',而“查询”列将继续显示最近的查询,即使它不再是 运行.