LSN 外部表示

问题描述 投票:0回答:3

根据postgres文档,LSN是一个64位整数,表示预写日志流中的字节位置。它被打印为两个十六进制数字,每个数字最多 8 位,用斜杠分隔;例如,16/B374D848。 有谁知道这2个十六进制数的含义是什么?

postgresql
3个回答
8
投票

用零填充斜杠右侧的部分,然后删除斜杠,就得到了文档中描述的以字节为单位的偏移量。


8
投票

pg_lsn
类型支持
-
操作并返回字节偏移量,因此这里是从pg_lsn转换为bigint的最简单方法:

SELECT pg_current_wal_lsn() - '0/0'

对于上面的例子,它看起来像这样:

SELECT '16/374D848'::pg_lsn - '0/0'

3
投票

引用您可以在here找到的文档:

在 PostgreSQL 9.2 及更早版本中,XLogRecPtr 是一个由两个 32 位整数组成的结构:

typedef struct XLogRecPtr
{
     uint32     xlogid;         /* log file #, 0 based */
     uint32     xrecoff;        /* byte offset of location in log file */
} XLogRecPtr;

从 PostgreSQL 9.3 开始,XLogRecPtr 是一个无符号 64 位整数,在 include/access/xlogdefs.h 中定义:

typedef uint64 XLogRecPtr;

我不知道数据库管理员的工作中是否有日常使用:如果我理解正确的话,您正在寻找一种将外部表示(pg_lsn)转换为内部表示(64位整数)的方法?如果是这样,并使用您的示例:16/B374D848 您正在寻找这样的答案:

# select x as bit_stream, bit_length(x), x::int8 as int8 from (select ('x' || lpad(split_part('16/B374D848', '/', 1), 8, '0') || lpad(split_part('16/B374D848', '/', 2), 8, '0'))::bit(64)) as t(x);

bit_stream|bit_length|int8 0000000000000000000000000001011000000000000000000000000000000000|64|94489280512 (1行)

查看代码(参见 pg_lsn_in_internal 函数),您可以使用这种 SQL 的另一种方法:

# select ('x' || lpad(split_part('16/B374D848', '/', 1), 8, '0'))::bit(32)::bigint << 32 | ('x' || lpad(split_part('16/B374D848', '/', 2), 8, '0'))::bit(32)::bigint;

?栏? 97500059720 (1行)

正如你在代码中看到的,仍然有两部分,第一部分是 id,第二部分是逻辑 WAL 文件名的偏移量。这就是我对代码的理解。旧版本的类型仍然使用位功能。

© www.soinside.com 2019 - 2024. All rights reserved.