PostgreSQL DBA(15) - WAL文件結構

數據庫的歷史變更會持久化到事務日誌文件中,本節簡單介紹了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)

三、參考資料

WAL Internals Of PostgreSQL

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章