在处理数据时,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_sizemax_wal_sendersmax_wal_sizemin_wal_sizesummarize_waltrack_wal_io_timingwal_block_size(只读)wal_bufferswal_compressionwal_consistency_checkingwal_debugwal_decode_buffer_sizewal_init_zerowal_keep_sizewal_levelwal_log_hintswal_receiver_create_temp_slotwal_receiver_status_intervalwal_receiver_timeoutwal_recyclewal_retrieve_retry_intervalwal_segment_size(只读)wal_sender_delaywal_sender_timeoutwal_skip_thresholdwal_summary_keep_timewal_writer_delaywal_writer_flush_after
源代码
头文件src/include/access/xlog_internal.h包含许多用于处理WAL文件的有用定义和宏,包括
XLOG_FNAME_LEN
参考资料
- PostgreSQL文档: 预写日志简介
- PostgreSQL文档: wal_segment_size
