PostgreSQL中的数据库一致性检查器


Answers:


11

PostgreSQL中没有内置的一致性检查命令或工具。

普遍的观点是,由于高质量的硬件/软件堆栈上不可能存在损坏和不一致的情况,因此没有必要。如果确实出现问题,则不能保证会进行任何类型的一致性检查,因此只会造成错误的安全感。我不同意这种观点,但是当在pgsql-hackers上定期讨论时,似乎就会出现这种情况。

像往常一样,潜在的问题是没有人特别需要一致性检查器工具来满足他们的迫切需求,因此没有人花时间写东西来解决问题,也没有人花钱在商业合同或内部基础上开发一个。志愿服务?:p

PostgreSQL(直到9.3版)不支持块级校验和。因此,您用来验证的主要内容之一不存在,因此无法进行验证。PostgreSQL 9.3中不存在用于扫描所有关系并验证校验和的工具,但是将需要添加该工具,并且该工具可能会出现在将来的版本中。同时,您只能SELECT *从每个关系中单独进行操作-但是由于PostgreSQL使用操作系统缓冲区高速缓存进行读取,因此没有任何保证实际上会强制读取底层磁盘块的保证。为此需要一个新工具。

PostgreSQL倾向于避免在可能的地方冗余存储信息,因此通常没有任何可检查的内容,只有一个授权源。除非出现相同的信息,或者可以从多个不同的位置派生出相同的信息,否则一致性检查器不会做很多事情。

在仍然繁忙和活动的数据库上,同时进行任何有用的检查也非常困难。大多数安装都不会愿意锁定整个数据库或一次至少锁定几个主要关系来运行某种一致性检查。因此,检查器将需要能够在需要进行并发修改的数据库上进行操作,从而使其更加难以编写并且能够可靠地检测到更少的问题。

如果编写了一个验证器工具,仍然有很多可以做的事情,特别是如果允许它采取多个关系互斥锁:

  • 检查磁盘上是否存在所有表空间。

  • 检查每个pg_class条目relfilenode在正确的表空间中是否具有与其对应的文件。

  • 检查可见性贴图,自由空间贴图等,以确保它们在应具有的可读性和与它们关联的关系相匹配时出现。

  • 报告孤立的磁盘上文件节点。(由于事务性DDL和延迟取消链接,这些是正常的,但是检查器可以强制急切取消链接并锁定所有关系,然后再运行检查)。

  • 阅读每个关系的每个部分,寻找明显的问题。对于堆关系,可能是这样的:

    • 一个xmin大于xmax(考虑XID环绕后)
    • 未来交易创建的元组
    • HOT链断裂/ ctid链断裂
    • 与表属性不匹配的元组结构
    • 没有往返行程_in_out功能不变或引发错误的任何基准面
    • NULLNOT NULL表格属性上设置的位图字段
    • 重新执行CHECK约束失败
  • 锁定所有涉及的表后,重新检查外键和排除约束

...可能还有很多我对Pg的胆识不甚了解,例如尝试检测残缺的页面,b树结构验证,健全性检查GIN和GiST索引,健全性检查pg_control等等,而我不会知道从哪里开始。

如果您热衷于使用这样的工具,那么最好的方法就是学习足够的知识,以提出有关其工作方式的具体建议-并花时间进行工作,或者资助他人花时间在其上发展。

我个人非常高兴能够使用postgres后端的特殊启动模式来检查停止的数据库集群,因此我可以(以某种方式)验证在文件系统级别pg_basebackup使用pg_start_backup(),,rsync和进行的物理数据库副本pg_stop_backup原子快照等

或者,您可以执行大多数其他人所要做的事情:确保硬件和软件堆栈健壮且配置正确,保持良好的备份并监视日志。在调试服务器之前,无可替代地对整个堆栈进行适当的测试-以及物理(流/ PITR)和逻辑(转储)的良好备份。在上线之前,请对已加载的数据库反复进行插拔测试,以确保您所谓的可靠I / O子系统确实如此。使用多种备份形式。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.