我们知道 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_name
in的实现开始src/backend/access/transam/xlogfuncs.c
,它使用XLogFileName
in 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 文件,所以我想知道您为什么要问这个问题。你想达到什么目的?