使用 pg_amcheck 检查 btree 索引损坏

🥳🤩🎂🎉 今天是我的生日,而且我们刚刚软启动了我们的 postgres.ai bot — 所以请原谅这次文章并不完整。不过,我仍然继续发布 😅

有多种类型的数据损坏。某些类型的数据损坏可以通过扩展 amcheck 来识别 (参见:Using amcheck Effectively),该扩展包含在标准的"contrib 模块"中 — 只需创建即可:

SQL
create extension amcheck;

对于 Postgres 14+,建议使用 CLI 工具 pg_amcheck,其优势之一是 -j (--jobs=NUM) 选项 — 可以通过并行工作进程更快地检查多个索引。

以下是一个使用示例 (填入连接选项并调整并行工作进程数):

Shell
pg_amcheck \
    {{ connection options }} \
    --install-missing \
    --jobs=8 \
    --verbose \
    --progress \
    --heapallindexed \
    --parent-check \
  2>&1 \
  | ts \
  | tee -a pg_amcheck.$(date "+%F-%H-%M").log

重要提示:选项 --heapallindexed 和 --parent-check 会触发一个耗时但更高级的检查。 --parent-check 选项会阻塞写操作 (如 UPDATE 等),因此不要在接收用户流量的生产节点上使用它。 选项 --heapallindexed 会增加检查的负载和持续时间,但可以小心地在生产环境中使用。 在没有这两个选项的情况下,执行的检查会较轻,可能无法发现某些问题 (参见:Using amcheck Effectively)。

一旦上述命令执行完成,检查生成的日志中是否包含错误:

Shell
egrep 'ERROR:|DETAIL:|LOCATION:' \
 pg_amcheck.$(date "+%F-%H-%M").log

如果检测到有损坏的索引,需要仔细分析,一旦问题得到确认,则需要重新创建索引 (使用REINDEX CONCURRENTLY)。

讨论与补充

在 GitHub 查看讨论

支持作者

感谢支持 PostgreSQL Howto 的长期维护。

微信赞赏码

读者交流群

二维码若已过期,可通过公众号 PostgreSQL 学徒或邮件联系。

PostgreSQL 学徒读者交流群二维码