pg_controldata中可以看到这样的lsn表示:
Latest checkpoint location: 2F/F849D720
Prior checkpoint location: 2F/F849D720
Latest checkpoint's REDO location: 2F/F849D6E8
Latest checkpoint's REDO WAL file: 000000010000002F000000F8
pg中的一些控制函数也可以看到类似的表示:
postgres=# select pg_current_wal_lsn();
pg_current_wal_lsn
--------------------
2F/F849D7C8
postgres=# select pg_walfile_name('2F/F849D7C8');
pg_walfile_name
--------------------------
000000010000002F000000F8
pg中的xlog文件命名看起来是另一种形式:
16777216 Mar 15 19:16 000000010000002F000000F8
16777216 Feb 28 15:16 000000010000002F000000F9
16777216 Feb 28 15:16 000000010000002F000000FA
16777216 Feb 28 15:16 000000010000002F000000FB
16777216 Feb 28 15:16 000000010000002F000000FC
16777216 Feb 28 15:16 000000010000002F000000FD
16777216 Feb 28 15:16 000000010000002F000000FE
16777216 Feb 28 15:16 000000010000002F000000FF
16777216 Feb 28 15:16 000000010000003000000000
16777216 Feb 28 15:16 000000010000003000000001
16777216 Feb 28 15:16 000000010000003000000002
16777216 Feb 28 15:16 000000010000003000000003
16777216 Feb 28 15:16 000000010000003000000004
16777216 Feb 28 15:16 000000010000003000000005
16777216 Feb 28 15:18 000000010000003000000006
16777216 Feb 28 15:18 000000010000003000000007
16777216 Feb 28 15:20 000000010000003000000008
16777216 Mar 11 15:18 000000010000003000000009
16777216 Mar 11 15:18 00000001000000300000000A
16777216 Mar 11 15:18 00000001000000300000000B
在代码中可以看到的lsn又是一种表示:
(gdb) p RedoStartLSN
$23 = 206029051624
(gdb) p/x checkPointLoc
$24 = 0x2ff849d720
上述三种形式的关系是什么?
解析:
一、文件名含义
000000010000002F000000F8
00000001 0000002F 000000F8
timeline logid segid
二、控制函数查出来的'A/B'形式的lsn含义
2F/F849D7C8
2F F8 49D7C8
logid segid offset
三、pg内部变量含义:就是lsn不带'/'
(gdb) p RedoStartLSN
$23 = 206029051624 = 0x2FF849D6E8
2F F8 49D6E8
logid segid offset
-
后两种是等价的,xlog文件名是把lsn最的6个16进制位省略了,也就是一个16MB的文件中可以保存省略的偏移量:
- offset范围:0x000000 - 0xFFFFFF = 16777215 = 16MB 所以16MB的文件的每个字节都可以通过offset索引到。
-
所以在代码调试时,看到lsn的变量,可以使用p/x打印值,就可以和xlog文件或外部函数查询到的值对比了。