预写日志 (WAL) 是一种确保数据完整性的标准方法。在大多数(如果不是全部)关于事务处理的书籍中都可以找到详细描述。简而言之,WAL的核心概念是,对数据文件(表和索引所在的存储位置)的更改必须在这些更改被记录下来之后才能写入,也就是说,在描述更改的 WAL 记录已刷新到永久存储之后才能写入。如果我们遵循这个过程,就不需要在每次事务提交时将数据页刷新到磁盘,因为我们知道,万一发生崩溃,我们能够使用日志恢复数据库:任何尚未应用于数据页的更改都可以从 WAL 记录中重做。(这就是前滚恢复,也称为 REDO。)
因为WAL在崩溃后可以恢复数据库文件内容,所以不需要日志文件系统来实现数据文件或 WAL 文件的可靠存储。事实上,日志的开销会降低性能,尤其是当日志导致文件系统 数据 被刷新到磁盘时。幸运的是,日志过程中的数据刷新通常可以通过文件系统挂载选项来禁用,例如,在 Linux ext3 文件系统上使用 data=writeback
。日志文件系统确实可以加快崩溃后的启动速度。
使用WAL可以显著减少磁盘写入次数,因为只需要将 WAL 文件刷新到磁盘即可保证事务已提交,而不是将事务更改的每个数据文件都刷新。WAL 文件是顺序写入的,因此同步 WAL 的成本远低于刷新数据页的成本。对于处理许多接触数据存储不同部分的小型事务的服务器来说,这一点尤其如此。此外,当服务器处理许多并发的小型事务时,一次对 WAL 文件的 fsync
就足以提交许多事务。
WAL还使得支持在线备份和时间点恢复成为可能,如 第 25.3 节中所述。通过归档 WAL 数据,我们可以支持回滚到可用 WAL 数据所覆盖的任何时间点:我们只需安装数据库的先前物理备份,然后重放 WAL 直到所需时间。更重要的是,物理备份不必是数据库状态的瞬时快照 — 如果它是经过一段时间创建的,那么重放该时间段的 WAL 将修复任何内部不一致。
如果您在文档中发现任何不正确、与您对特定功能的体验不符或需要进一步澄清的内容,请使用 此表单 报告文档问题。