# 30.3.预写日志(WAL)
预写日志记录(WAL)是确保数据完整性的标准方法。关于事务处理的详细描述可以在大多数(如果不是全部的话)书籍中找到。简单地说,WAL的核心概念是,对数据文件(表和索引所在的位置)的更改必须在记录这些更改之后才能写入,也就是说,在描述更改的日志记录被刷新到永久存储器之后。如果我们遵循这个过程,就不需要在每次事务提交时将数据页刷新到磁盘上,因为我们知道,如果发生崩溃,我们将能够使用日志恢复数据库:任何尚未应用于数据页的更改都可以从日志记录中重新进行。(这是前滚恢复,也称为重做。)
# 提示
因为WAL在崩溃后恢复数据库文件内容,所以日志文件系统对于数据文件或WAL文件的可靠存储不是必需的。事实上,日志记录开销会降低性能,尤其是在日志记录导致文件系统崩溃的情况下数据要刷新到磁盘。幸运的是,日志记录期间的数据刷新通常可以通过文件系统装载选项禁用,例如。,数据=写回
在Linux ext3文件系统上。日志文件系统确实可以在崩溃后提高引导速度。
使用WAL可以显著减少磁盘写入次数,因为只有日志文件需要刷新到磁盘才能保证提交事务,而不是事务更改的每个数据文件。日志文件是按顺序写入的,因此同步日志的成本远低于刷新数据页的成本。对于处理许多涉及数据存储不同部分的小型事务的服务器来说尤其如此。此外,当服务器处理许多小型并发事务时,一个同步
日志文件的大小可能足以提交许多事务。
WAL还可以支持在线备份和时间点恢复,如中所述第26.3节。通过存档WAL数据,我们可以支持恢复到可用WAL数据覆盖的任何时间:我们只需安装数据库的事先物理备份,并在所需时间内重播WAL日志。此外,物理备份不必是数据库状态的即时快照——如果是在一段时间内进行的,那么在这段时间内重放WAL日志将修复任何内部不一致。