WAL文件名的含义是什么?

fra*_*ncs 5 postgresql

我们知道 WAL 文件位于$PGDATA/pg_xlog目录中,但我不知道 WAL 文件的含义,例如名为“0000000A00005283000000E0”的 WAL 文件,

我看到一些博客说 WAL 文件名尊重格式名称,该格式名称细分为 3 个由 8 个十六进制数字组成的序列,定义:

时间线 ID

区块ID

段 ID

但我仍然不明白这一点。任何人都可以解释这一点?

- 询问

francs=> select pg_current_xlog_location();
 pg_current_xlog_location 
--------------------------
 5283/D9C2A320
(1 row)

francs=> select pg_xlogfile_name(pg_current_xlog_insert_location());
     pg_xlogfile_name     
--------------------------
 0000000A00005283000000E0
Run Code Online (Sandbox Code Playgroud)

Cra*_*ger 13

WAL 文件命名实际上是一个实现细节。查看源代码 - 从pg_xlogfile_namein的实现开始src/backend/access/transam/xlogfuncs.c,它使用XLogFileNamein src/include/access/xlog_internal.h

#define XLogFileName(fname, tli, logSegNo)  \
    snprintf(fname, MAXFNAMELEN, "%08X%08X%08X", tli,       \
             (uint32) ((logSegNo) / XLogSegmentsPerXLogId), \
             (uint32) ((logSegNo) % XLogSegmentsPerXLogId))
Run Code Online (Sandbox Code Playgroud)

从那里你可以看到,在当前的 PostgreSQL 版本中,存档名称是时间轴 ID 的八个零填充的十六进制数字,然后是一个有点奇怪的段格式值,它计算为 64 位段号的高 32 位零 -填充为 8 个十六进制数字,然后将低 32 位零填充为 8 个十六进制数字。这种格式确实是一个历史怪癖。

由于 的定义,您可以解决这个问题XLogSegmentsPerXLogId

#define XLogSegmentsPerXLogId   (UINT64CONST(0x100000000) / XLOG_SEG_SIZE)
Run Code Online (Sandbox Code Playgroud)

这是1 << 32即2 ^ 32,所以真的XLogFileName只是服用高和低32位。

也就是说,您不需要根据文件名对 WAL 执行任何操作,除非使用它们来唯一标识 WAL 文件,所以我想知道您为什么要问这个问题。你想达到什么目的?

  • 是的,它们将按字典顺序排列,因为文件名本质上是一个填充的元组(timelineid、segid_top_32bits、segid_bottom_32bits)。但是请使用现有的工具来管理 WAL,比如 `pg_archivecleanup`,而不是使用你自己的工具。如果 WAL 命名方案更改,这些工具将得到更新;你家卷了一个不会。 (2认同)