支持的版本: 当前 (17) / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1

28.3. 预写式日志 (WAL) #

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

提示

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

使用WAL可以显著减少磁盘写入次数,因为为了保证事务被提交,只需要将 WAL 文件刷新到磁盘,而不是每次事务更改的数据文件都刷新到磁盘。WAL 文件是顺序写入的,因此同步 WAL 的成本远低于刷新数据页的成本。对于处理许多接触数据存储不同部分的小型事务的服务器来说尤其如此。此外,当服务器处理许多小型并发事务时,一次 fsync WAL 文件可能足以提交许多事务。

WAL也使得支持在线备份和时间点恢复成为可能,如第 25.3 节中所述。通过归档 WAL 数据,我们可以支持恢复到可用 WAL 数据覆盖的任何时间点:我们只需安装数据库的先前物理备份,并重放 WAL 到所需时间即可。更重要的是,物理备份不必是数据库状态的瞬时快照 — 如果它是在一段时间内制作的,那么重放该期间的 WAL 将修复任何内部不一致性。

提交更正

如果您在文档中看到任何不正确、与您使用特定功能的体验不符或需要进一步澄清的内容,请使用此表单来报告文档问题。