在处理数据时,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
报告。
与 WAL 相关的配置项
max_slot_wal_keep_size
max_wal_senders
max_wal_size
min_wal_size
summarize_wal
track_wal_io_timing
wal_block_size
(只读)wal_buffers
wal_compression
wal_consistency_checking
wal_debug
wal_decode_buffer_size
wal_init_zero
wal_keep_size
wal_level
wal_log_hints
wal_receiver_create_temp_slot
wal_receiver_status_interval
wal_receiver_timeout
wal_recycle
wal_retrieve_retry_interval
wal_segment_size
(只读)wal_sender_delay
wal_sender_timeout
wal_skip_threshold
wal_summary_keep_time
wal_writer_delay
wal_writer_flush_after
源代码
头文件src/include/access/xlog_internal.h 包含许多用于操作 WAL 文件的有用定义和宏,包括
XLOG_FNAME_LEN
参考文献
- PostgreSQL 文档: 预写日志简介
- PostgreSQL 文档: wal_segment_size