预写日志 (WAL) 是一种确保数据完整性的标准方法。大多数(如果不是全部)有关事务处理的书籍中都对其有详细描述。简而言之,WAL其核心概念就是只有当数据文件的改动(数据表和索引所在位置)已经记录下来后才可以写入,也就是说,首先 WAL 记录会描述改动信息并冲入永久存储器中。如果我们遵循此过程,就不需要在每次事务提交时将数据页冲入磁盘,因为我们知道在出现故障时,我们可以利用日志恢复数据库:所有未应用到数据页的改动都可以从 WAL 记录中重做。(即前滚恢复,也称为 REDO。)
因为WAL在故障后会恢复数据库文件内容,所以可靠地存储数据文件或 WAL 文件并不需要使用记录文件系统。事实上,记录开销可能会降低性能,尤其当记录导致文件系统 数据 冲入磁盘时。幸运的是,往往可以使用文件系统挂载选项(比如 Linux ext3 文件系统上的 data=writeback
)来禁用记录期间的数据冲入。记录文件系统确实可提高故障后的启动速度。
使用WAL会导致磁盘写入次数大幅减少,因为只有 WAL 文件需要冲入磁盘才能保证事务已提交,而不是事务更改的每个数据文件。WAL 文件是顺序写入的,因此同步 WAL 的成本远低于冲入数据页的成本。对于处理许多小事务并触及数据存储不同部分的服务器来说,这一点尤为适用。此外,当服务器处理许多并发的小事务时,一个 fsync
WAL 文件就足以提交许多事务。
WAL还可以支持在线备份和时点恢复,如 第 25.3 节 所述。通过归档 WAL 数据,我们可以支持还原到可用 WAL 数据覆盖的任意时间点:只需安装数据库的先前物理备份,再回放 WAL 直到所需的时间点即可。更重要的是,物理备份不必是数据库状态的瞬时快照——如果它是在一段时间内创建的,那么在此期间回放 WAL 将修复任何内部不一致性。