预写日志 (WAL)

一种通过在将更改写入数据文件本身之前将对数据文件的更改记录到日志文件中来确保数据完整性的方法

在处理数据时,PostgreSQL 首先将事务记录到预写日志(WAL,也称为事务日志)中,然后再将更改写入受影响的数据文件本身。这有助于确保数据完整性,因为在服务器崩溃的情况下,PostgreSQL 可以从 WAL 日志中重放尚未应用于数据文件的任何更改。它还可以提高 I/O 性能,因为对 WAL 日志的写入是顺序执行的,这使得将 WAL 日志同步到磁盘的成本低于同步单个数据页。

WAL 文件还可以用于将相同的更改应用于另一个数据库(“日志传送”)或作为备份解决方案的一部分与基本备份一起使用。

在某些间隔 - 检查点 - WAL 日志中记录的事务被写入其相应的数据文件,并且检查点被记录在 WAL 日志中。检查点之前的 WAL 日志内容不再需要,可以删除/回收(或在需要复制等情况下存档)。

WAL 文件存储在服务器数据目录的pg_walPostgreSQL 9.6 及更早版本:pg_xlog)子目录中。

WAL 功能是在PostgreSQL 7.1中引入的。

WAL 文件大小

默认 WAL 文件大小为 16MB。此值在src/include/pg_config_manual.h中定义为

/*
 * This is default value for wal_segment_size to be used at initdb when run
 * without --wal-segsize option. Must be a valid segment size.
 */
#define DEFAULT_XLOG_SEG_SIZE   (16*1024*1024)

如代码注释所示,此值可以通过initdb使用--wal-segsize选项覆盖(仅限PostgreSQL 11及更高版本)。

此值由只读配置参数wal_segment_size报告。

源代码

头文件src/include/access/xlog_internal.h包含许多用于操作 WAL 文件的有用定义和宏,包括

  • XLOG_FNAME_LEN

分类

PostgreSQL 概念PostgreSQL 内部机制WAL

参见

检查点LSNXLogRecPtrpg_waldump

反馈

提交任何关于“预写日志 (WAL)”的评论、建议或更正 此处