如何确定并发 Postgres 索引被标记为 INVALID 的原因?

Kev*_*rke 9 postgresql index

我正在尝试同时创建一个索引。

CREATE INDEX CONCURRENTLY blocks_expr_idx6 ON blocks USING btree ('blah') WHERE "type" = 'user root';
Run Code Online (Sandbox Code Playgroud)

运行查询 12 小时后,如果我运行\d blocksPostgres 报告索引无效:

"blocks_expr_idx6" btree ('blah') WHERE "type" = 'user root' INVALID
Run Code Online (Sandbox Code Playgroud)

文档说:

如果在扫描表时出现问题,例如死锁或唯一索引中的唯一性违规,CREATE INDEX 命令将失败,但会留下“无效”索引。出于查询目的,该索引将被忽略,因为它可能不完整;但是它仍然会消耗更新开销。psql \d 命令将报告这样的索引为 INVALID。

在这种情况下推荐的恢复方法是删除索引并再次尝试执行 CREATE INDEX CONCURRENTLY。(另一种可能性是使用 REINDEX 重建索引。但是,由于 REINDEX 不支持并发构建,因此该选项似乎不太吸引人。)

我怎样才能弄清楚为什么Postgres 将索引标记为 INVALID?

Joh*_*hir 4

对此的一个简单答案是删除它,再次运行它,保留终端窗口(或以其他方式记录输出)并查看发生什么错误。