Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16

30.3. 预写式日志 (WAL) #

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

提示

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

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

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