PostgreSQL DBA(15) - WAL檔案結構

husthxd發表於2018-12-17

資料庫的歷史變更會持久化到事務日誌檔案中,本節簡單介紹了PG中事務日誌檔案的體系結構(以下簡稱WAL檔案結構)。

一、WAL檔案結構

PG使用無符號64bit整型(uint64)作為日誌檔案的定址空間,理論上來說,如果只有一個日誌檔案,那麼這個事務日誌檔案的大小最大為2^64Bytes(即16M*1TB=16EB)。為了高效管理事務日誌檔案,PG把日誌檔案劃分為N個大小為16M(預設值)的WAL segment file.
總體結構如下圖所示:


PostgreSQL DBA(15) - WAL檔案結構
總體結構

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

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/6906/viewspace-2374779/,如需轉載,請註明出處,否則將追究法律責任。

相關文章