30.2. 预写日志记录(WAL)

  • Write-Ahead Logging *(WAL)是确保数据完整性的标准方法。在大多数(如果不是全部)有关 Transaction 处理的书中可以找到详细的描述。简而言之,WAL 的中心概念是,只有在记录了这些更改之后,即在描述更改的日志记录已刷新到永久存储之后,才必须写入对数据文件(表和索引所在的位置)的更改。如果遵循此过程,则无需在每次事务提交时都将数据页刷新到磁盘,因为我们知道在发生崩溃的情况下,我们将能够使用日志来恢复数据库:尚未应用的所有更改可以从日志记录重做到数据页。 (这是前滚恢复,也称为 REDO.)

Tip

由于 WAL 在崩溃后会还原数据库文件的内容,因此日记记录文件系统对于可靠地存储数据文件或 WAL 文件不是必需的。实际上,日志记录开销会降低性能,特别是如果日志记录导致文件系统* data *刷新到磁盘上,则尤其如此。幸运的是,日志记录期间的数据刷新通常可以通过文件系统挂载选项来禁用,例如 Linux ext3 文件系统上的data=writeback。日志文件系统在崩溃后确实可以提高启动速度。

使用 WAL 可以大大减少磁盘写入次数,因为仅需要将日志文件刷新到磁盘以保证事务已提交,而不是每个数据文件都会被事务更改。日志文件是按 Sequences 写入的,因此同步日志的开销要比刷新数据页的开销少得多。对于处理许多涉及数据存储不同部分的小事务的服务器而言尤其如此。此外,当服务器正在处理许多小的并发事务时,日志文件中的一个fsync足以提交许多事务。

WAL 还可以支持在线备份和时间点恢复,如Section 25.3中所述。通过存档 WAL 数据,我们可以支持恢复到可用 WAL 数据所覆盖的任何 Moment:我们只需安装数据库的先前物理备份,然后将 WAL 日志重播到所需时间即可。而且,物理备份不必是数据库状态的即时快照-如果是在一段时间内进行的,则在此期间重播 WAL 日志将解决任何内部不一致问题。