我们知道 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
WAL 文件命名实际上是一个实现细节。查看源代码 - 从
pg_xlogfile_name
in的实现开始src/backend/access/transam/xlogfuncs.c
,它使用XLogFileName
insrc/include/access/xlog_internal.h
:从那里你可以看到,在当前的 PostgreSQL 版本中,存档名称是时间线 ID 的八个零填充十六进制数字,然后是一个有点奇怪的段值,它可以计算为 64 位段号的高 32 位零-填充到 8 个十六进制数字,然后将低 32 位零填充到 8 个十六进制数字。这种格式确实是一个历史怪癖。
由于 的定义,您可以解决这个问题
XLogSegmentsPerXLogId
:即
1 << 32
2 ^ 32,所以实际上XLogFileName
只是取高 32 位和低 32 位。也就是说,您不需要根据文件名对 WAL 做任何事情,除了使用它们来唯一标识 WAL 文件,所以我想知道您为什么要问这个。你想达到什么目的?