[整页写入] 是必需的,因为在操作系统崩溃期间正在进行的页面写入可能仅部分完成,从而导致磁盘页面包含新旧数据的混合。通常存储在 WAL 中的行级更改数据将不足以在崩溃后恢复期间完全恢复此类页面。存储整页图像保证页面可以正确恢复...
为什么 WAL 日志不足以进行完全恢复?我的理解是它们包含自(至少)最后一个检查点以来的所有页面更新。
有人可以举例说明从最后一个检查点简单地重放 WAL 日志仍然会导致数据丢失吗?
[整页写入] 是必需的,因为在操作系统崩溃期间正在进行的页面写入可能仅部分完成,从而导致磁盘页面包含新旧数据的混合。通常存储在 WAL 中的行级更改数据将不足以在崩溃后恢复期间完全恢复此类页面。存储整页图像保证页面可以正确恢复...
为什么 WAL 日志不足以进行完全恢复?我的理解是它们包含自(至少)最后一个检查点以来的所有页面更新。
有人可以举例说明从最后一个检查点简单地重放 WAL 日志仍然会导致数据丢失吗?
许多(大多数?)重做记录实际上需要块处于某种合理的状态才能重放。
考虑:
并非所有 WAL 记录都是行级的。假设您读取并重放了一条 WAL 记录,上面写着“我根据碎片整理块的通常规则对这个块进行了碎片整理”。给定块的正确起始状态,这将是确定性操作,但给定块状态的混合,它不是确定性的,因此不能安全地重放。可能可以枚举哪些 WAL 记录类型属于这种类型,并且只有那些类型会导致 FPW,但这似乎很脆弱。
如果一个块确实遭受了写入撕裂,我个人不想依赖该块中的所有字节恰好是旧状态或新状态,恰好在两个连续的块中。
如果 WAL 不能完全读取到最后(并且怎么知道它是不是?)那么可能会有一些块具有“新”数据,这些数据实际上是“未来”数据,对于不再存在的未来存在。从理论上讲,这永远不会发生,因为 WAL 在块数据发布之前已同步到磁盘。但在崩溃正在演变但尚未显现的纳秒内,谁知道会发生什么?最好丢失一些报告已提交的事务,然后完全破坏系统。