數據庫的歷史變更會持久化到事務日誌文件中,本節簡單介紹了PG中事務日誌文件的體系結構(以下簡稱WAL文件結構)。
一、WAL文件結構
PG使用無符號64bit整型(uint64)作爲日誌文件的尋址空間,理論上來說,如果只有一個日誌文件,那麼這個事務日誌文件的大小最大爲2^64Bytes(即16M*1TB=16EB)。爲了高效管理事務日誌文件,PG把日誌文件劃分爲N個大小爲16M(默認值)的WAL segment file.
總體結構如下圖所示:
WAL segment file
WAL segment file文件長度爲24,由3部分組成,每個部分是8個16進制數字:
1.第1部分是TimeLineID,0x00000000 -> 0xFFFFFFFF
2.第2部分是邏輯文件ID,0x00000000 -> 0xFFFFFFFF
3.第3部分是物理文件ID,0x00000000 -> 0x000000FF
邏輯文件ID佔32bit,物理文件ID佔8bit,16M的文件佔24bit,合計64bit.PG通過這三部分的組合,達到最大64bit的文件尋址空間.
文件存儲目錄
事務日誌文件存儲在$PGDATA/pg_wal目錄下
二、LSN
LSN:Logical Sequence Number,XLOG record中的LSN表示該記錄寫入到事務日誌中位置,大小爲uint64.在PG中可以理解爲事務日誌文件中的偏移(Offset).
LSN由3部分組成,分別是邏輯文件ID,物理文件ID和文件內偏移.如LSN號1/4288E228,其中1爲邏輯文件ID,42爲物理文件ID,88E228爲WAL segment file文件內偏移.
按此規則,給定一個LSN,很容易得到其對應的日誌文件(假定時間線爲1):
LSN-1/4288E228 --> WAL segment file:00000001 00000001 00000042
PG也提供了相應的函數根據LSN獲取日誌文件名:
testdb=# SELECT pg_walfile_name('1/4288E228');
pg_walfile_name
--------------------------
000000010000000100000042
(1 row)