0
点赞
收藏
分享

微信扫一扫

Postgresql中lsn的三种记录形式

艾晓雪 2022-03-17 阅读 72

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文件或外部函数查询到的值对比了。

举报

相关推荐

0 条评论