几乎每个主stream数据库都有一个function来计算每页,每个扇区或每条logging的校验和。
现在对于一个在崩溃之后能够完全恢复的数据库,比如PostgreSQL,是一个有用的校验和? 只要xlog没问题,不pipe数据本身发生什么样的损坏,都不会丢失数据,因为重做日志会被重放,每一个提交的事务都会被恢复。 所以校验和在恢复上是没用的。
不pipe文件系统或磁盘是否保留校验和来检测损坏? 所以,除非校验和是每个logging,否则它只是告诉你存在腐败 – 操作系统应该在你尝试阅读的时候大声嚷嚷 – 在操作中如此无用?
我无法想象校验和是如何在任何理智的数据库中有所帮助的,但是因为他们都使用它们 – 我想说这只是我想象中的失败。 那么它有用吗?
校验和是重要的,并且由于种种原因是有用的。 可能是最重要的包括:
事实上,只有一小部分stream行的文件系统带有实际文件内容的校验和[维基百科文章] 。 至于硬盘,他们的耐用性指标从来没有赶上容量的上升,所以只要有足够的数据和/或吞吐量,你一定会偶尔得到未被发现的错误[CERN研究] 。 也就是说,除非您有足够的校验和来检测它们,而此时则需要进行应用程序级检查。
由于大多数文件系统不保留校验和(值得注意的例外是ZFS),数据库中的校验和仍然是有用的。
在PostgreSQL中,WALlogging是校验和,但不是数据页面,所以你将无法检测操作系统或硬件是否已经粉碎了你的数据。 为数据页面实现校验和是PostgreSQL中的一个计划特性,但是如果要保持并发性,那么在实现中会遇到一些非常困难的问题。 search“postgresql块级crc”或类似的东西了解更多(或变得完全混淆)。