目录
- 如何确定或计算 LSN(日志序列号)
- **一、获取当前 LSN**
- **二、确定日志解析的起始 LSN**
- **三、LSN 与物理文件的映射**
- **四、应用场景**
如何确定或计算 LSN(日志序列号)
LSN(Log Sequence Number)是数据库日志系统中用于标识日志记录位置的关键标识符,其确定方法因数据库类型而异。以下是针对不同场景的具体操作步骤:
一、获取当前 LSN
-
MySQL 中查看 LSN
- 通过系统变量
SHOW ENGINE INNODB STATUS
,在输出结果中查找Log sequence number
字段,表示当前 redo log 的 LSN。 - 示例输出:
LOG Log sequence number 123456789
- 通过系统变量
-
PostgreSQL 中查看 LSN
- 使用内置函数
pg_current_wal_lsn()
直接查询当前 WAL(Write-Ahead Log)的 LSN:
输出示例:SELECT pg_current_wal_lsn();
12/6000148
,表示逻辑位置为12
段,偏移量6000148
。
- 使用内置函数
二、确定日志解析的起始 LSN
-
基于 Checkpoint 机制
- 在数据库恢复时,LSN 的起始位置通常与 Checkpoint 相关。
- MySQL:恢复会从 Checkpoint 记录的 LSN 开始,重放 redo log 直到 Write Pos(当前日志写入位置)。
- PostgreSQL:检查控制文件(
pg_control
)中的Latest checkpoint location
,通过命令pg_controldata
获取。
-
手动指定 LSN
- 若需从特定时间点恢复,需结合时间戳与 LSN 的映射关系(如 PostgreSQL 的
pg_waldump
工具可解析 WAL 文件中的 LSN 和时间信息)。
- 若需从特定时间点恢复,需结合时间戳与 LSN 的映射关系(如 PostgreSQL 的
三、LSN 与物理文件的映射
- PostgreSQL 的 WAL 文件命名规则
- WAL 文件名格式为
000000XXYYYYYYYYYYYYYYYYZZ
,其中:XX
表示时间线 ID;YYYYYYYYYYYYYYYY
为 LSN 的高位段;ZZ
为 LSN 的低位段(每段对应 256MB 文件块)。
- 通过 LSN 计算文件名:
# 示例:LSN=12/6000148 segment_size = 16 * 1024 * 1024 # 16MB(默认) file_number = (lsn // segment_size) % 256
- WAL 文件名格式为
- MySQL 的 redo log 文件定位
- redo log 文件固定大小循环写入,通过 LSN 计算文件偏移量:
偏移量 = ( LSN % 文件总大小 ) \text{偏移量} = (\text{LSN} \ \% \ \text{文件总大小}) 偏移量=(LSN % 文件总大小)
- redo log 文件固定大小循环写入,通过 LSN 计算文件偏移量:
四、应用场景
- 数据库恢复:根据 Checkpoint LSN 确定恢复起点,重放后续日志。
- 日志解析工具:如解析 binlog/WAL 时,需指定起始 LSN 以过滤事件。
- 主从复制:从库通过 LSN 确认同步进度。