数据库校验和功能——冗余?有用?

数据库校验和功能——冗余?有用?

几乎每个主流数据库都具有计算每页、每个扇区或每个记录的校验和的功能。

现在,对于在任何崩溃后执行完全恢复的数据库(如 PostgreSQL),校验和还有用吗?只要 xlog 正常,就不会丢失数据,无论数据本身发生何种损坏,因为重做日志会重放,所以每个已提交的事务都将被恢复。因此,校验和在恢复时毫无用处。

文件系统或磁盘不是会保留校验和来检测损坏吗?因此,除非校验和是针对每个记录的,否则它所做的只是告诉您有损坏 - 操作系统应该在您尝试读取它的那一刻向您大喊大叫 - 因此在操作中毫无用处?

我无法想象校验和在任何正常的数据库中会有什么用处 - 但既然它们都使用校验和 - 我想说这只是我的想象力不足。那么它有什么用呢?

答案1

出于各种原因,校验和非常重要且有用。可能最重要的原因包括:

  • 检查复制/集群数据库是否同步
  • 检查数据是否已从备份正确恢复
  • 确保恢复过程没有失败或出现错误
  • 检查数据库的完整性(例如,查看是否有人在您不注意的时候修改过文件)

答案2

事实上,只有一小部分流行的文件系统带有实际文件内容的校验和[维基百科文章]. 至于硬盘,其耐用性指标从未赶上容量的飙升,因此,如果有足够的数据和/或吞吐量,你肯定会偶尔遇到未检测到的错误[CERN 研究]。也就是说,除非您有足够的校验和来检测它们,此时需要进行应用程序级别的检查。

答案3

由于大多数文件系统不保留校验和(值得注意的例外是 ZFS),因此数据库中的校验和仍然有用。

在 PostgreSQL 中,WAL 记录经过校验,但数据页没有,因此您无法检测操作系统或硬件是否已粉碎您的数据。为数据页实现校验和是 PostgreSQL 中的一项计划功能,但如果要保持并发性,则实现时会遇到一些非常棘手的问题。搜索“postgresql block level crc”或类似内容以了解更多信息(否则会完全困惑)。

相关内容