在处理数据时,PostgreSQL 首先将事务记录到预写日志
(WAL
,也称为事务日志
)中,然后再将更改写入受影响的数据文件本身。这有助于确保数据完整性,因为在服务器崩溃的情况下,PostgreSQL 可以从 WAL 日志中重放尚未应用于数据文件的任何更改。它还可以提高 I/O 性能,因为对 WAL 日志的写入是顺序执行的,这使得将 WAL 日志同步到磁盘的成本低于同步单个数据页。
WAL 文件还可以用于将相同的更改应用于另一个数据库(“日志传送”)或作为备份解决方案的一部分与基本备份一起使用。
在某些间隔 - 检查点 - WAL 日志中记录的事务被写入其相应的数据文件,并且检查点被记录在 WAL 日志中。检查点之前的 WAL 日志内容不再需要,可以删除/回收(或在需要复制等情况下存档)。
WAL 文件存储在服务器数据目录的pg_wal(PostgreSQL 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_segment_size