一、簡介
讀取MySQL的binlog 並將其解析為可讀的日志是一件簡單的事情,mysqlbinlog 命令就可以將bin日志解析, 那postgresql是否可以將pg_wal 中的日志進行解析,並且提供一些特殊的功能,例如想查詢某個時間短插入的數據量。pg_waldump 可以解決這個問題,通過pg_waldump來解析pg_wal 日志來分析和解決一些問題。
二、wal內部
WAL是自動被啟用的。除了確保滿足WAL日志存放所需要的磁盤空間以及一些必要的調優外,管理員無需執行任何操作。當每個新記錄被寫入時,WAL記錄被追加到WAL日志中。 插入位置由日志序列號(LSN)描述,該日志序列號是日志中的字節偏移量, 隨每個新記錄單調遞增。WAL日志被存放在數據目錄的pg_wal目錄里,它是作為一個文件段的集合存儲的,通常每個段16MB大小(不過這個大小可以通過initdb配置選項--with-wal-segsize來修改)。每個段分割成多個頁,通常每個頁為8K。段文件的名字是不斷增長的數字,從000000010000000000000001
開始。目前這些數字不能回卷。
wal日志被放置在和主數據庫文件不同的另外一個磁盤上會比較好。你可以通過把pg_wal目錄移動到另外一個位置(當然在此期間服務器應當被關閉),然后在原來的位置上創建一個指向新位置的符號鏈接來實現重定位日志。
在完成一個檢查點並且刷寫了日志文件之后,檢查點的位置被保存在文件pg_control里。因此在恢復的開始, 服務器首先讀取pg_control,然后讀取檢查點記錄; 接着它通過從檢查點記錄里標識的日志位置開始向前掃描執行 REDO操作。 因為數據頁的所有內容都保存在檢查點之后的第一個頁面修改的日志里(假設full_page_writes沒有被禁用), 所以自檢查點以來的所有變化的頁都將被恢復到一個一致的狀態。
pg_control很小(比一個磁盤頁小),因此它不會出現頁斷裂問題, 並且到目前為止還沒有發現僅僅由於無法讀取pg_control本身導致數據庫失敗的報告。 因此,盡管這在理論上是一個薄弱環節,但是pg_control看起來似乎並不是實際會發生的問題。
三、分析示例
1、展示 STARTSEG
到 ENDSEG
的事務日志
2、日志參數介紹
rmgr : 資源名稱

查看此時 wal 日志,如果沒有日志則通過手動切換select pg_switch_wal()
發現插入數據后,wal 日志會先進入資源等待 rmgr: Standby ,分配一個事務id 15718 ,進入rmgr: Heap,把插入事務寫入到指定日志偏移位置 desc: INSERT off 5 ,進入索引資源 rmgr: Btree ,插入索引 desc: INSERT_LEAF off 3,分配下一事務id RUNNING_XACTS nextXid 15720 latestCompletedXid 15719 oldestRunningXid 15720
4、執行 update 語句
查看日志
發現此時 desc: UPDATE off 1 xmax 15725 ; 事務日志已經寫入,desc: COMMIT 2022-02-14 00:37:59.569893 PST 完成提交
5、執行delete語句
查看日志
發現此時descDELETE off 15 KEYS_UPDATED 寫入日志,desc:COMMIT 2022-02-14 00:42:00.195505 PST事務提交
6、顯示事務回滾
查看日志
發現此時 desc: ABORT 2022-02-14 00:46:03.515257 PST 事務已經取消
7、創建數據庫
查看日志
四、pg_waldump參數
pg_waldump --help pg_waldump decodes and display
PostgreSQL write-ahead logs for debugging.
Usage: pg_waldump [OPTION]... [STARTSEG [ENDSEG]]
STARTSEG 從指定的日志段文件開始讀取。這也隱含地決定了要搜索文件的路徑以及 要使用的時間線。
ENDSEG 在讀取指定的日志段文件后停止。
Options:
-b, --bkp-details 輸出有關備份塊的細節。
-e, --end=RECPTR 在指定的日志位置停止讀取,而不是一直讀取到日志流的末尾。
-f, --follow 在到達可用 WAL 的末尾之后,保持每秒輪詢一次是否有新的 WAL 出現。
-n, --limit=N 顯示指定數量的記錄,然后停止。
-p, --path=PATH 要在哪個目錄中尋找日志段文件。默認是在當前目錄的pg_xlog 子目錄中搜索。
-r, --rmgr=RMGR 只顯示由指定資源管理器生成的記錄。如果把list作為資源管理器名稱 傳遞給這個選項,則打印出可用資源管理器名稱的列表然后退出。
-s, --start=RECPTR 要從哪個日志位置開始讀取。默認是從找到的最早的文件的第一個可用日志記錄開始。
-t, --timeline=TLI 要從哪個時間線讀取日志記錄。默認是使用startseg(如果指定) 中的值,否則默認為 1
-V, --version 打印pg_xlogdump版本並且退出。
-x, --xid=XID 只顯示用給定事務 ID 標記的記錄。
-z, --stats[=record] 顯示概括統計信息(記錄的數量和尺寸以及全頁鏡像)而不是顯示 每個記錄。可以選擇針對每個記錄生成統計信息,而不是針對每個 資源管理器生成。
-?, --help show this help, then exit