Postgresql:full_page_writes 如何帮助防止数据丢失?

Dav*_*any 5 postgresql recovery

来自postgresql 文档

需要[全页写入],因为操作系统崩溃期间正在进行的页面写入可能仅部分完成,导致磁盘上的页面包含新旧数据的混合。通常存储在 WAL 中的行级更改数据不足以在崩溃后恢复期间完全恢复此类页面。存储整页图像可以保证页面可以正确恢复...

为什么 WAL 日志不足以进行完整恢复?我的理解是它们包含自(至少)最后一个检查点以来的所有页面更新。

有人可以举例说明如何简单地重放上一个检查点的 WAL 日志仍然会导致数据丢失吗?

jja*_*nes 2

许多(大多数?)重做记录实际上需要块处于某种合理的状态才能重播到其中。

考虑:

  1. 并非所有 WAL 记录都是行级的。假设您读取并重放一条 WAL 记录,其中显示“我根据块碎片整理的通常规则对该块进行了碎片整理”。给定块的正确起始状态,这将是确定性操作,但给定块状态的混合,它不是确定性的,因此不能安全地重放。可能可以枚举哪些 WAL 记录类型属于这种类型,并且只有这些类型才会导致 FPW,但这似乎很脆弱。

  2. 如果一个块确实遭受了撕裂的写入,我就不想依赖该块中的所有字节恰好是旧状态或新状态,恰好是两个连续的块。

  3. 如果 WAL 无法完全读到最后(人们怎么知道它是否是?),那么可能会有一些块具有“新”数据,而这些数据实际上是“未来”数据,对于不再存在的未来存在。理论上,这种情况永远不会发生,因为 WAL 在块数据释放之前已同步到磁盘。但在崩溃正在演变但尚未显现的纳秒内,谁知道会发生什么?最好是丢失一些据报告已提交的事务,然后完全破坏系统。