是否有任何技术/工具/方法来调查 postgres 表中的行级损坏?
这个论坛上提出的大多数解决方案都归结为“尝试执行 VACUUM FULL 来重建表,如果这不起作用,请删除表并从备份中恢复”
反正有没有真正修复数据?是否有读取和手动编辑原始 postgres 数据文件并仅删除/修复损坏的行的方法?
我正在使用的系统直接从外部提要读取数据到 postgres 表中,然后在夜间备份过程有机会保存它之前显示损坏的证据。重新运行外部提要不是一种选择,因此在实践中,如果我有任何损坏,一整天的数据都会丢失。
PostgreSQL 可以包含两个(嗯,一个和一个包装器)工具,它们可能会在这里为您提供帮助—— amcheck和pg_amcheck。
检查:
amcheck
是一个contrib 模块(以下简称 cm) - 这些是作为源分发的一部分提供的附加功能,但默认情况下未启用。请注意,许多这些 cm 被广泛使用,并且许多人建议它们应该默认出现 - 然而,PostgreSQL 的“精益和平均”理念意味着它们不是,新用户可能需要时间来弄清楚如何准确充分利用它们。例如,该
pg_stat_statements
扩展被 PostgreSQL 社区中的所有重量级人物广泛使用和推荐。顺便说一句,“贡献模块”和“扩展”基本上是同义词。但是请注意,虽然所有 cm 都是扩展,但并非所有扩展都是 cm - 远非如此。例如,虽然TimescaleDB和CitusData 都不是 cm(即它们没有与源代码捆绑在一起),但它们是扩展!如果您有兴趣,这里有一个完整的PostgreSQL 扩展生态系统。恕我直言,回到正题!
在 PostgreSQL 中,关系是表或索引。
您可以访问 amcheck 页面以获取有关其功能的更多详细信息。
pg_amcheck:
pg_amcheck 实用程序可以在
$PGHOME/bin
目录中找到。只有在使用make world
或等效编译数据库时才能在此处找到它。它可能会或可能不会安装在您自己的发行版上,具体取决于 - 我可以确认它包含在 EnterpriseDB 的 Windows (14) 发行版中 - 我目前无法与其他发行版交谈。如上所述,它是
amcheck
扩展的包装器:必须安装amcheck 扩展才能使用包装器(有意义!)。
请注意(来自页面):
一般来说,amcheck 只能证明腐败的存在;它不能证明它的缺席。
(释义)- amcheck 仅适用于 B-tree 索引。
后者是,(恕我直言),一个严重的漏洞。
用例:
因此,让我们看一下这些工具的实际用例。
2022 年 5 月 24 日,Michael Paquier 在推特上发布了关于使用 PostgreSQL 14 的潜在腐败问题
2022-06-02 pganalyze.com上的一篇文章展示了如何使用 amcheck 来确认 bug 并查看它是否影响了您的系统
概括:
这里的重点是——我认为——没有系统 [is | 可以| 永远都是]完美的,像这样的工具[是| 可以| 可能] 在可能存在潜在问题的情况下不时需要 - 这有点像自卫权 - 你永远不想使用它,但你知道它就在那里,以防万一!
NB PostgreSQL 已经在 2022 年 6 月 9 日发布了一个非周期版本——所有这一切的伟大之处在于它都是在公开的邮件列表中完成的,供大家查看!