9.2 事务日志与WAL段文件

PostgreSQL在逻辑上将XLOG记录写入事务日志,即,一个长度用8字节表示的虚拟文件(16 EB)。

虽说事务日志的容量实际上应该是无限的,但8字节长度的地址空间已经足够宽广了。目前是不可能处理这个量级的单个文件的。因此PostgreSQL中的事务日志实际上默认被划分为16M大小的一系列文件,这些文件被称作WAL段(WAL Segment) 。如图9.6所示。

WAL段文件尺寸

从版本11开始,在使用initdb创建数据库时,可以通过--wal-segsize选项来配置WAL段文件的大小。

图9.6 事务日志与WAL段文件图9.6 事务日志与WAL段文件

WAL段文件的文件名是由24个十六进制数字组成的。

时间线标识

PostgreSQL的WAL有时间线标识(TimelineID,四字节无符号整数) 的概念,用于 第十章 基础备份与时间点恢复 中所述的时间点恢复(PITR) 。不过在本章中时间线标识将固定为0x00000001,因为接下来的几节里还不需要这个概念。

第一个WAL段文件名是\( 00000001\color{blue}{00000000}000000\color{blue}{01}\),如果第一个段被XLOG记录写满了,就会创建第二个段\( 00000001\color{blue}{00000000}000000\color{blue}{02}\),后续的文件名将使用升序。在\( 00000001\color{blue}{00000000}000000\color{blue}{FF}\)被填满之后,就会使用下一个文件\( 00000001\color{blue}{00000001}000000\color{blue}{00}\)。通过这种方式,每当最后两位数字要进位时,中间8位数字就会加一。与之类似,在\( 00000001\color{blue}{00000001}000000\color{blue}{FF}\)被填满后,就会开始使用\( 00000001\color{blue}{00000002}000000\color{blue}{00}\),依此类推。

WAL文件名

使用内建的函数pg_xlogfile_name(9.6及以前的版本),或pg_walfile_name(10及以后的版本),我们可以找出包含特定LSN的WAL段文件。例如:

testdb=# SELECT pg_xlogfile_name('1/00002D3E');   -- 9.6-
testdb=# -- SELECT pg_walfile_name('1/00002D3E'); -- 10+

     pg_xlogfile_name   
--------------------------
 000000010000000100000000
(1 row)