PostgreSQL在逻辑上将XLOG记录写入事务日志,即,一个长度用8字节表示的虚拟文件(16 EB)。
虽说事务日志的容量实际上应该是无限的,但8字节长度的地址空间已经足够宽广了。目前是不可能处理这个量级的单个文件的。因此PostgreSQL中的事务日志实际上默认被划分为16M大小的一系列文件,这些文件被称作WAL段(WAL Segment) 。如图9.6所示。
WAL段文件尺寸
从版本11开始,在使用
initdb
创建数据库时,可以通过--wal-segsize
选项来配置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)