“先写”规定存储顺序
数据库会把表和索引页缓存在内存中,也可能逐步写回文件。预写日志要求相关修改的恢复记录先进入持久存储,然后才允许对应数据页的变化越过规定的持久化边界。
这样即使一部分数据页尚未更新、另一部分已经写出,恢复仍有足够信息重建应有状态。日志存在于内存里还不等于已满足先写要求;关键是故障后还能取得所需记录。
参考:[1]
用日志确认,再逐步写页
PostgreSQL通常在确认提交前同步相应WAL记录,而不必逐个同步这笔事务改动的所有数据页。日志按顺序写入,也可把多个并发事务需要的同步合在一次刷新中,从而降低提交开销。
崩溃后,重做过程把日志记录的修改重新应用到需要恢复的数据页。具体系统会规定怎样识别记录、确定恢复起点及处理未完成事务;仅有一份普通文本操作记录,不自动构成符合要求的WAL实现。
日志与备份需要配合
保留适当的基础备份并归档后续日志,可以把数据库恢复到日志覆盖范围内的某个时刻。恢复需要的是相互配套的状态与记录,不能假定随意留下的一小段日志足以重建全部数据库。
日志和数据若一同损坏,单靠本机恢复记录也可能无能为力。持久化配置、存储可靠性、备份保留与恢复演练共同决定保护范围;选择异步确认还会改变最近提交在崩溃时能否保存的承诺。