1

我在 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 中。

4

2 回答 2

1

在该query列中,您会看到该连接上的最后一个查询。这并不意味着查询处于活动状态。检查- 它可能是的state列,因为查询已终止。pg_stat_activityidle

于 2021-06-30T13:55:36.287 回答
1

您的监控查询已严重过时。'<IDLE>' 上次在 9.1 版的“查询”字段中用作空闲查询的标记。在较新的版本中,有一个单独的“状态”列,在这种情况下将显示“事务中的空闲(中止)”,而“查询”列将继续显示最近的查询,即使它是不再运行。

于 2021-06-30T16:47:56.863 回答