WAL文件的分割
从理论上讲,WAL文件只有一个,对它的写入只有在文件尾部增加这一个操作。因为LSN是8字节,而LSN表示WAL文件上某个字节的位置,或者偏移量,所以这个WAL文件的体积是非常巨大的,是16EB(2^64)字节这么大。在这个文件中,第一个字节的LSN是0,最后一个字节的LSN是0xFFFFFFFFFFFFFFFF。为了更便于阅读,我们在表示LSN时,会在高4字节和低4字节的分割处加上一个”/“符号,所以最后一个字节的LSN是FFFFFFFF/FFFFFFFF。
这么巨大的一个WAL文件,已目前的计算机工程水平,没有任何一块磁盘可以存放下,所以我们可以把它进行分割。分割的方式是把它划分为4GB大小的一个文件,很显然,这样的文件一共有4GB个,因为2^64 / 2^32 = 2^32,如下图所示:

这种4GB大小的文件被称为”逻辑WAL文件“(logicall WAL file),如果我们给它们编号,则编号正好是所有LSN的高4字节。譬如一个LSN为ABC/DEF12345,则这个LSN位置所表示的字节x被保存在编号为0xABC的WAL文件中。WAL文件的编号范围从0到0xFFFFFFFF,共计2^32个。这个编号被称为逻辑WAL文件编号。
但是4GB大小的划分方案依然显得很庞大,PG进一步对逻辑文件进行划分,最小按照1MB的尺寸,最大按照1GB的尺寸,划分成的WAL文件被称为”段“(segment)文件。这些段文件就是我们在pg_wal目录下看到的真实的文件。我们提到”WAL文件“这个概念,基本上都是指WAL段文件。
当我们按照1GB的体积划分是,4GB的逻辑文件被分为4个,编号是0、1、2和3。当我们按照1MB的体积划分时,4GB的逻辑文件被分为4096个,编号是0到4095。在缺省情况下,我们按照16MB来划分,那么一个4GB的逻辑文件就被分成256个,编号是0到255,如下图所示:

至此,我们有两个编号,一个是逻辑文件的编号,其范围从0到0xFFFFFFFF,第二个是段文件的编号,其范围不定。如果按照缺省16MB的划分方案,段文件的编号范围从0到255。这两个编号形成二级编号,即x.y,x是逻辑文件的编号,y是段文件的编号。
理解了这些知识后,我们就容易理解WAL段文件的文件名的规则,它包含时间线,逻辑文件编号和段文件编号三个信息,如下图所示:

大家很容易看到一个规律,就是因为在16MB的划分方式下,段文件的编号取值范围是0到255,用一个字节就可以表示,所以WAL文件的文件名,从后往前数,跳过2位后,有连续的6个0是不会改变的。
两级编号也可以变成一级编号。在WAL文件的大小是16MB的情况下,编号为0的逻辑文件被分割为256个段文件,它们的编号是0.0, 0.1, 0.2, ..., 0.255。编号为1的逻辑文件也被分割为256个段文件,它们的编号是1.0, 1.1, 1.2, ..., 1.255。如果把这些编号变成一维的,则0.0的编号为0, 0.1的编号为1, 0.255的编号为255, 1.0的编号为256, 1.1的编号为257, 1.255的编号是511。依次类推。