【问题标题】:pg_stat_activity keeps showing the query which has timeout due to statement_timeoutpg_stat_activity 不断显示由于 statement_timeout 而超时的查询
【发布时间】:2021-09-12 12:24:23
【问题描述】:

我在 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 age usename query
9133 00:00:54.366638 <db_user> COMMIT
31551 00:01:49.70594 <db_user> ¶SELECT pg_sleep(31)

为什么查询 pg_stat_activity 时仍然显示超时查询。我希望既然这个查询已经终止,它一定不会出现在 pg_stat_activity 中。

【问题讨论】:

    标签: sql postgresql timeout psql pg-stat-statements


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2018-05-31
        • 2014-03-17
        • 2018-10-23
        • 1970-01-01
        • 2015-10-27
        • 1970-01-01
        • 1970-01-01
        • 2011-08-27
        • 2011-11-04
        相关资源
        最近更新 更多