目錄
- 如何確定或計算 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 確認同步進度。