代码改变世界

【磐维数据库】LSN与归档文件名的关系解析

2025-03-28 11:52  狂澜与玉昆0950  阅读(269)  评论(0)    收藏  举报

中国移动磐维数据是基于openGauss定制开发的中国移动自用版OLTP数据库。自去2023年年12月发布以来,受到广泛关注,目前已成功上线百余套。 在产品落地的过程中,我们积累了大量的迁移、适配,以及问题分析诊断的经验。 北京海量数据技术股份有限公司,作为移动磐维集中式数据库外协厂商,对集中式磐维数据库的运维、管理、开发等均有深入了解。在江西移动现场运维整理汇总经验。

在数据库系统中,LSN(Log Sequence Number,日志序列号)是一个非常关键的概念。它标识了数据库事务日志的位置,并在事务日志的管理、恢复以及归档过程中起着至关重要的作用。在openGauss数据库中,LSN与归档文件名之间有着密切的关系。本篇文章将深入探讨LSN与归档文件名的关系,以及如何通过LSN计算对应的归档文件名。

  1. 什么是LSN?
    LSN,全称为Log Sequence Number,是数据库系统中用于标识事务日志位置的标识符。LSN随着数据库操作的进行而不断递增,确保了所有事务的顺序和一致性。LSN通常以两部分表示,如CC/2BFFDC50,其中:
CC:表示日志段编号(Log Segment Number)。
2BFFDC50:表示该日志段内的偏移量(Offset)。

2.归档文件名解析
归档文件名通常采用以下格式:

000000010000000000000003

这个文件名由三个部分组成:

时间线ID(8位):文件名的前8位代表时间线ID,用于标识在数据库时间线中的特定状态。
逻辑日志序列号(16位):中间的16位表示该文件的起始LSN。这是文件的关键部分,用于恢复和重建数据库状态。
偏移量(8位):最后的8位是LSN偏移量,用于标识当前WAL文件的相对位置。
在解析文件名时,可以通过这些字段了解该归档文件中的日志范围和它的具体位置。例如,文件名000000010000000000000003表示的是时间线1上的LSN从000000000000000003开始的日志文件。

image.png

  1. LSN与归档文件名的关系
    在openGauss数据库中,WAL(Write-Ahead Logging)日志的归档文件名通常由以下三部分组成:

时间线ID(Timeline ID):标识数据库时间线的唯一标识符。
日志编号(Log Number):表示具体的日志段编号。
段编号(Segment Number):表示在日志段内的具体位置。
文件名的格式一般为:

TimelineID + LogNumber + SegmentNumber

例如,文件名00000001000000CC0000002B代表的含义如下:

时间线ID:00000001
日志编号:000000CC
段编号:0000002B
  1. LSN与归档文件名的计算方法
    4.1 日志段编号与偏移量
    LSN中的前半部分(如CC)表示日志段编号,将其转换为十进制可得知该日志段的位置。例如,CC在十六进制中对应的十进制数是204。后半部分(如2BFFDC50)表示该日志段内的偏移量,转换为十进制后,可以精确定位到具体的字节位置。

4.2 计算归档文件名
计算归档文件名的步骤如下:

日志编号计算:
使用公式:
image.png

其中16M表示WAL日志段的大小。

段编号计算:
使用公式:
image.png

该公式帮助我们定位具体的段编号。

4.3 示例计算
我们挑一个归档进行检验:00000001000000CC00000029

pg_xlogdump 00000001000000CC00000029

image.png

4.3.1 CC/29FA3A90
4.3.1.1分解LSN
日志段编号(Log Segment Number):CC,这是十六进制的编号。
偏移量(Offset within the Log Segment):29FA3A90,这是十六进制的偏移量。
4.3.1.2将 LSN 转换为十进制
4.3.1.2.1日志段编号 CC
CC 是十六进制,转换为十进制是 204。

4.3.1.2.2 偏移量 29FA3A90
29FA3A90 是十六进制,转换为十进制是 703,942,672。

4.3.1.3计算日志编号(Log Number)
使用公式:
image.png

这里的 LSN 是由日志段编号和偏移量组合成的:
image.png

取整部分就是 0。

4.3.1.4计算段编号(Segment Number)
使用公式:
image.png

计算步骤如下:
image.png

取整部分就是 41。

4.3.1.5组合归档文件名
假设时间线ID为 00000001,那么归档文件名由三部分构成:

时间线ID:00000001

日志段编号:000000CC(十六进制的204号日志段)

段编号:00000029(十六进制的41)

最终归档文件名为:00000001000000CC00000029

4.3.2 CC/29FDCB30
4.3.1.1分解LSN
日志段编号(Log Segment Number):CC,这是十六进制的编号。
偏移量(Offset within the Log Segment):29FDCB30,这是十六进制的偏移量。
4.3.1.2将 LSN 转换为十进制
4.3.1.2.1日志段编号 CC
CC 是十六进制,转换为十进制是 204。

4.3.1.2.2 偏移量 29FDCB30
29FDCB30 是十六进制,转换为十进制是 704,155,696。

4.3.1.3计算日志编号(Log Number)
使用公式:
image.png

这里的 LSN 是由日志段编号和偏移量组合成的:
image.png

取整部分就是 0。

4.3.1.4计算段编号(Segment Number)
使用公式:
image.png

计算步骤如下:
image.png

取整部分就是 41。

4.3.1.5组合归档文件名
假设时间线ID为 00000001,那么归档文件名由三部分构成:

时间线ID:00000001

日志段编号:000000CC(十六进制的204号日志段)

段编号:00000029(十六进制的41)

最终归档文件名为:00000001000000CC00000029