根据postgres文档,LSN是一个64位整数,表示预写日志流中的字节位置。它被打印为两个十六进制数字,每个数字最多 8 位,用斜杠分隔;例如,16/B374D848。 有谁知道这2个十六进制数的含义是什么?
用零填充斜杠右侧的部分,然后删除斜杠,就得到了文档中描述的以字节为单位的偏移量。
pg_lsn
类型支持-
操作并返回字节偏移量,因此这里是从pg_lsn转换为bigint的最简单方法:
SELECT pg_current_wal_lsn() - '0/0'
对于上面的例子,它看起来像这样:
SELECT '16/374D848'::pg_lsn - '0/0'
引用您可以在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 文件名的偏移量。这就是我对代码的理解。旧版本的类型仍然使用位功能。