如何验证 postgres 9.3 db 没有损坏?

Rub*_*nsh 6 postgresql corruption data-integrity postgresql-9.3

我有一个在 ubuntu 服务器上运行的 postgres 9.3 db。
大约一个月前,我们的 VPS 托管公司解决了服务器上的硬件问题。

问题很快得到解决,一切似乎都运行良好。
我们使用另一台服务器上的酒保运行备份 - 备份和恢复工作正常(我检查过)。

数据损坏的第一个迹象是几天前:我决定在我们的数据库上做一个完整的 pg_dump,就像我每隔一段时间做的那样,它失败了(块中的页头无效......) - 数据似乎已经很久以前就损坏了 - 大约在硬件问题发生的时候(那是损坏记录上的日期)。我求助于查找损坏的记录,然后将其删除并手动恢复。

在那之后,我能够做一个完整的 pg_dump。

为了检查其他损坏 - 我从备份中设置了不同的数据库服务器并对所有表运行 pg_repack 以验证我能够重建所有索引和表。

我的问题是:
1. 我如何确定我的数据库中没有任何额外的损坏?

2. 如何定期检查我的数据完整性?
3. 除了转储整个数据库并重新索引它(我已经这样做了)之外,我还能做些什么来验证我们数据库的完整性?

PS - 我没有启用块校验和。

Koo*_*ter 2

正如其他地方所述,核心 PostgreSQL 中没有类似于 SQL Server (SQL Server DBCC CHECKDB) 或 Oracle 中的损坏专用工具。这并不意味着您不能关注腐败并尽力防止腐败。一些想法:

  • 使用好的硬件。这个硬件应该适当尊重fsync。在您的情况下不可调整,但仍然很重要。
  • 初始化集群时使用校验和。当然,这样做会受到一点惩罚,但确实值得这么麻烦。您可以创建一个新集群,在这个新实例中转储和重新加载数据库,并享受更强大的环境。它从 9.3 开始可用,非常适合您。
  • 使用 . 运行定期、自动化的逻辑备份pg_dump最好使用 Barman 进行自动物理备份,但这不会检查损坏。只有pg_dump(它将读取所有表中的所有行)才能为您提供防止表损坏的保险。这绝对是你应该自动化的事情。如果您没有该位置,请重定向pg_dump/dev/null。如果您有正确的表,则始终可以重建损坏的索引。我认为有一些索引损坏查找工具。