WAL相當于oracle中的redo log,mysql中的redolog,9.6及之前名為xlog,10+目前在pg_wal檔案夾中,wal段預設大小為16M,在initdb時可以指定大小,後續原則上不可以修改。可以通過pg_waldump檢視二進制日志的内容。wal的結構解析(雖然不完全正确,比如LSN的實體檔案ID解析就不正确)。wal的實體結構如下:

clog(全稱Commit Log,PostgreSQL transaction-commit-log manager,主要在clog.c中實作)裡面記錄了事務的執行狀态,每次事務送出和復原的時候,都需要更新該狀态,PostgreSQL伺服器通路該檔案确定事務的狀态,儲存在pg_xact目錄中,每個檔案大小為256KB,每個事務2位(bit),故1個檔案可以包含131072個事務。對于第一次修改的資料行來說,因為事務狀态存儲在clog中,是以修改後第一次判斷行的可見性需要通過通路clog來确定,而通路clog是一個非常耗費性能的過程,故關于clog通路優化,有一個很長的discussion。
事務在clog中的狀态包括:。定義在xxx中。
因為pg的MVCC在檔案中實作undo,即使事務復原了,新建立的行也不會被删除,但是因為clog中記錄了事務的執行狀态,是以其他事務在xmin和xmax判斷時候可以過濾掉或不過濾掉這些記錄。
pg_xact(9.6及之前名為pg_clog,雖然代碼中還是clog.c)
[postgres@hs-10-20-30-194 pg_xact]$ ll
total 13208
-rw------- 1 postgres postgres 262144 May 24 17:26 0000
-rw------- 1 postgres postgres 262144 May 24 17:26 0001
-rw------- 1 postgres postgres 262144 May 24 17:27 0002
-rw------- 1 postgres postgres 262144 May 24 17:27 0003
-rw------- 1 postgres postgres 262144 May 24 17:27 0004
-rw------- 1 postgres postgres 262144 May 24 17:28 0005
-rw------- 1 postgres postgres 262144 May 24 17:28 0006
-rw------- 1 postgres postgres 262144 May 24 17:28 0007
clog和wal的互動:這得先了解事務的完整過程。
每當一個新的clog頁面(和pg中其他頁面一樣,也是BLCKSZ宏定義,預設8KB)被初始化為0的時候,clog.c就會生成一條wal記錄。xact.c中針對送出和復原操作的記錄(recording)也會寫clog。對于同步送出:在clog記錄commit前,XLOG會確定被重新整理,是以WAL可以自動被保證。對于異步送出:必須跟蹤最新的LSN影響的每個CLOG頁,這樣才能重新整理響應的xlog。clog的細節描述具體可以參見:https://www.interdb.jp/pg/pgsql05.html。clog的清理參見:https://www.interdb.jp/pg/pgsql06.html#_6.4.,由vacuum freeze負責清理。
其他目錄說明:
pg_logical
pg_commit_ts
pg_multixact
pg_subtrans
pg_snapshots
pg_replslot
pg_dynshmem
9.6目錄說明
10.0+目錄說明(到14為止未在發生調整)
LightDB Enterprise Postgres--金融級關系型資料庫,更快、更穩、更懂金融!