postgresql中clog(commit log)文件与wal的关系及交互流程
WAL相當于oracle中的redo log,mysql中的redolog,9.6及之前名為xlog,10+當前在pg_wal文件夾中,wal段默認大小為16M,在initdb時可以指定大小,后續原則上不可以修改。可以通過pg_waldump查看二進制日志的內容。wal的結構解析(https://www.cnblogs.com/abclife/p/13708947.html,雖然不完全正確,比如LSN的物理文件ID解析就不正確)。wal的物理結構如下:
WAL歸檔的執行過程可見https://wiki.moritetu.xyz/?PostgreSQL/%E8%A7%A3%E6%9E%90/WAL%E3%82%A2%E3%83%BC%E3%82%AB%E3%82%A4%E3%83%96。
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,由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--金融級關系型數據庫,更快、更穩、更懂金融!
總結
以上是生活随笔為你收集整理的postgresql中clog(commit log)文件与wal的关系及交互流程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: verilog的学习
- 下一篇: 自己搭建git服务器_搭建git服务器w