几乎每个主流数据库都具有计算每页、每个扇区或每个记录的校验和的功能。
现在,对于在任何崩溃后执行完全恢复的数据库(如 PostgreSQL),校验和还有用吗?只要 xlog 正常,就不会丢失数据,无论数据本身发生何种损坏,因为重做日志会重放,所以每个已提交的事务都将被恢复。因此,校验和在恢复时毫无用处。
文件系统或磁盘不是会保留校验和来检测损坏吗?因此,除非校验和是针对每个记录的,否则它所做的只是告诉您有损坏 - 操作系统应该在您尝试读取它的那一刻向您大喊大叫 - 因此在操作中毫无用处?
我无法想象校验和在任何正常的数据库中会有什么用处 - 但既然它们都使用校验和 - 我想说这只是我的想象力不足。那么它有什么用呢?
答案1
出于各种原因,校验和非常重要且有用。可能最重要的原因包括:
- 检查复制/集群数据库是否同步
- 检查数据是否已从备份正确恢复
- 确保恢复过程没有失败或出现错误
- 检查数据库的完整性(例如,查看是否有人在您不注意的时候修改过文件)
答案2
答案3
由于大多数文件系统不保留校验和(值得注意的例外是 ZFS),因此数据库中的校验和仍然有用。
在 PostgreSQL 中,WAL 记录经过校验,但数据页没有,因此您无法检测操作系统或硬件是否已粉碎您的数据。为数据页实现校验和是 PostgreSQL 中的一项计划功能,但如果要保持并发性,则实现时会遇到一些非常棘手的问题。搜索“postgresql block level crc”或类似内容以了解更多信息(否则会完全困惑)。