PostgreSQL WAL日志 Segment

1 背景知识

本章主要介绍WAL Segment 文件。

2 LSN号作为日志文件的寻址空间时

WAL日志文件的大小最大为 2^64Bytes (即 16M*1TB=16EB)。

为了高效管理事务日志文件, PostgreSQL 把日志文件划分为 N 个大小为 16M (internal)的 WAL segment file

3 WAL Segment 文件名解析

WAL segment file文件命长度为 24 个字符,由3部分组成,每个部分是8个16进制数字:

00000001 00000000 00000001
00000001 00000000 00000001
... ... ...
... ......
00000001 FFFFFFFF 000000FF
00000001 FFFFFFFF 000000FF
WAL segment file (16M)
WAL segment file (16M)
0xFFFFFFFF/FFFFFFFFF
0xFFFFFFFF/FFFFFFFFF
Text is not SVG - cannot display
  1. 第1部分:是TimeLineID,取值范围0x00000000 -> 0xFFFFFFFF
  2. 第2部分:是逻辑文件ID,取值范围0x00000000 -> 0xFFFFFFFF
  3. 第3部分:是物理文件ID,取值范围0x00000000 -> 0x000000FF

逻辑文件ID占 32bit,物理文件ID占 8bit,
16M的文件占24bit,合计64bit.PG通过这三部分的组合,达到最大 64bit 的文件寻址空间。

4 LSN 号解析

4.1 LSN 是什么?

LSN 全程为 Logical Sequence Number。使用基于

LSN用于 XLOG record 记录写入到WAL日志中的物理位置,大小为 uint64.在KES中可以理解为事务日志文件中的偏移量(Offset)。

4.2 LSN由3部分组成,

  1. 逻辑文件ID
  2. 物理文件ID
  3. 文件内偏移

4.3 LSN 拆解

如LSN号1/4288E228

  1. 1 为逻辑文件ID,
  2. 42 为物理文件ID,
  3. 88E228为WAL segment file文件内偏移.
Info

按此规则,给定一个LSN,很容易得到其对应的日志文件(假定时间线为1):
LSN-1/4288E228 --> WAL segment file:00000001 00000001 00000042

4.4 wal 日志结构说明

LSN:3FB/AE61A1A0
3FB:代表wal文件的第二部分
AE:代表wal文件的最后两位
61A1A0:代表偏移量

00000001000003FB000000AE
wal文件由24个字符,三部分组成,每部分由8个字符组成,代表含义如下
00000001:代表数据库运行的时间轴,如果恢复过数据库(主备切换)这个值会增大
000003FB:对LSN的第二部分对应
000000AE:代表walfile文件的最后两位