我在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为30s:
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 | <db_user>COMMIT |
31551 | 00:01:49.70594 | <db_user>¶选择pg_sleep(31( |
您的监控查询严重过时。'<IDLE>'最后一次用作"中空闲查询的标记;查询";字段。在较新的版本中;状态";列,在这种情况下将显示"事务中空闲(中止(",而";查询";列将继续显示最近的查询,即使它不再运行。
在query
列中,您可以看到该连接上的最后一个查询。这并不意味着查询处于活动状态。检查pg_stat_activity
的state
列——可能是idle
,因为查询已终止。