ALTER TABLE … ADD COLUMN 在一个小表上花费很长时间,pg_stat_activity 不显示该表上的任何查询

GG.*_*GG. 2 postgresql alter-table locking

所以这是永远挂起的查询:

ALTER TABLE tasks
ADD COLUMN in_progress BOOLEAN NOT NULL DEFAULT FALSE;
Run Code Online (Sandbox Code Playgroud)

该表tasks少于 20,000 行,每 5 分钟左右查询一次。

我检查了pg_stat_activity大约 10 次,但从未显示任何锁定表的查询:

SELECT *
FROM pg_stat_activity
WHERE query LIKE '%tasks%';

--- No results
Run Code Online (Sandbox Code Playgroud)

我尝试了真空吸尘器,但没有帮助:

VACUUM (VERBOSE, ANALYZE) tasks;
Run Code Online (Sandbox Code Playgroud)

我还尝试添加没有约束和默认值的列,我希望在这样的表上几乎是即时的,但是当我停止查询时,查询已经运行了 1 分钟:

ALTER TABLE tasks
ADD COLUMN in_progress BOOLEAN;
Run Code Online (Sandbox Code Playgroud)

我在同一时间段内对另一个表(约 1000 行)运行了查询,结果是即时的。

任何想法?

PostgreSQL 11.13

通过 DBeaver 执行的查询(为了以防万一,我多次无效/重新连接)。

Lau*_*lbe 5

必须有人持有表的锁,这意味着您有一个开放的事务。这是一个错误;任何交易都不应保持开放状态。

要找出哪些会话阻止您的语句:

  1. 在运行之前ALTER TABLE,运行

    SELECT pg_backend_pid();
    
    Run Code Online (Sandbox Code Playgroud)
  2. 跑挂了ALTER TABLE

  3. 启动一个新的数据库会话并运行

    SELECT pg_blocking_pids(12345);
    
    Run Code Online (Sandbox Code Playgroud)

    其中 12345 是上一个查询的结果。

  4. 终止您在上一个查询中找到的会话

    SELECT pg_terminate_backend(54321);
    
    Run Code Online (Sandbox Code Playgroud)