如何查看完全阻塞的 postgres 查询?

Ton*_*ony 9 postgresql logs concurrency

我正在使用此页面中的语句来查看 Postgres 中的阻塞查询

SELECT bl.pid                 AS blocked_pid,
         a.usename              AS blocked_user,
         ka.query               AS blocking_statement,
         now() - ka.query_start AS blocking_duration,
         kl.pid                 AS blocking_pid,
         ka.usename             AS blocking_user,
         a.query                AS blocked_statement,
         now() - a.query_start  AS blocked_duration
  FROM  pg_catalog.pg_locks         bl
   JOIN pg_catalog.pg_stat_activity a  ON a.pid = bl.pid
   JOIN pg_catalog.pg_locks         kl ON kl.transactionid = bl.transactionid AND kl.pid != bl.pid
   JOIN pg_catalog.pg_stat_activity ka ON ka.pid = kl.pid
  WHERE NOT bl.granted;
Run Code Online (Sandbox Code Playgroud)

然而,查询被截断了,所以我通常看不到WHERE子句中的内容,这使得调试这些阻塞问题非常困难。是否有设置可以告诉 postgres 将完整查询记录到pg_stat_activity

小智 11

所跟踪查询的长度可以在参数 中找到track_activity_query_size

18.8.1. 查询和索引统计收集器

track_activity_query_size (integer)
Run Code Online (Sandbox Code Playgroud)

pg_stat_activity.current_query字段指定为跟踪每个活动会话当前正在执行的命令而保留的字节数 。默认值为1024。该参数只能在服务器启动时设置。

例如,如果您track_activity_query_size=16384在您的配置中有,那么这将意味着最多 16k 的查询文本将被收集。

  • 只是为了确保它清楚(如引用中所述,可能会被忽略).. 更改该配置选项将需要重新启动服务器才能生效。 (2认同)