2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15
開發版本: devel

F.37. pg_walinspect — 底層 WAL 檢查 #

pg_walinspect 模組提供了 SQL 函式,允許您在底層檢查正在執行的 PostgreSQL 資料庫叢集的預寫日誌 (WAL) 的內容,這對於除錯、分析、報告或教育目的非常有用。它類似於 pg_waldump,但可以透過 SQL 訪問,而不是作為一個單獨的實用程式。

此模組的所有函式都將使用伺服器的當前時間線 ID 提供 WAL 資訊。

注意

pg_walinspect 函式經常使用 LSN 引數呼叫,該引數指定了一個已知感興趣的 WAL 記錄 開始 的位置。但是,某些函式(例如 pg_logical_emit_message)會返回剛插入的記錄 之後 的 LSN。

提示

所有顯示位於特定 LSN 範圍內的記錄資訊的 pg_walinspect 函式都允許接受晚於伺服器當前 LSN 的 end_lsn 引數。使用 來自未來的 end_lsn 引數不會引發錯誤。

FFFFFFFF/FFFFFFFF(最大的有效 pg_lsn 值)作為 end_lsn 引數可能很方便。這等同於提供一個與伺服器當前 LSN 匹配的 end_lsn 引數。

預設情況下,這些函式的使用僅限於超級使用者和 pg_read_server_files 角色成員。超級使用者可以使用 GRANT 命令將訪問許可權授予其他人。

F.37.1. 通用函式 #

pg_get_wal_record_info(in_lsn pg_lsn) returns record #

獲取位於 in_lsn 引數處或之後的一個 WAL 記錄的資訊。例如:

postgres=# SELECT * FROM pg_get_wal_record_info('0/E419E28');
-[ RECORD 1 ]----+-------------------------------------------------
start_lsn        | 0/E419E28
end_lsn          | 0/E419E68
prev_lsn         | 0/E419D78
xid              | 0
resource_manager | Heap2
record_type      | VACUUM
record_length    | 58
main_data_length | 2
fpi_length       | 0
description      | nunused: 5, unused: [1, 2, 3, 4, 5]
block_ref        | blkref #0: rel 1663/16385/1249 fork main blk 364

如果 in_lsn 不是 WAL 記錄的開頭,則會顯示下一個有效 WAL 記錄的資訊。如果沒有下一個有效 WAL 記錄,該函式將引發錯誤。

pg_get_wal_records_info(start_lsn pg_lsn, end_lsn pg_lsn) returns setof record #

獲取 start_lsnend_lsn 之間所有有效 WAL 記錄的資訊。每條 WAL 記錄返回一行。例如:

postgres=# SELECT * FROM pg_get_wal_records_info('0/1E913618', '0/1E913740') LIMIT 1;
-[ RECORD 1 ]----+--------------------------------------------------------------
start_lsn        | 0/1E913618
end_lsn          | 0/1E913650
prev_lsn         | 0/1E9135A0
xid              | 0
resource_manager | Standby
record_type      | RUNNING_XACTS
record_length    | 50
main_data_length | 24
fpi_length       | 0
description      | nextXid 33775 latestCompletedXid 33774 oldestRunningXid 33775
block_ref        |

如果 start_lsn 不可用,該函式將引發錯誤。

pg_get_wal_block_info(start_lsn pg_lsn, end_lsn pg_lsn, show_data boolean DEFAULT true) returns setof record #

獲取 start_lsnend_lsn 之間具有一個或多個塊引用的所有有效 WAL 記錄的每個塊引用的資訊。每個 WAL 記錄的每個塊引用返回一行。例如:

postgres=# SELECT * FROM pg_get_wal_block_info('0/1230278', '0/12302B8');
-[ RECORD 1 ]-----+-----------------------------------
start_lsn         | 0/1230278
end_lsn           | 0/12302B8
prev_lsn          | 0/122FD40
block_id          | 0
reltablespace     | 1663
reldatabase       | 1
relfilenode       | 2658
relforknumber     | 0
relblocknumber    | 11
xid               | 341
resource_manager  | Btree
record_type       | INSERT_LEAF
record_length     | 64
main_data_length  | 2
block_data_length | 16
block_fpi_length  | 0
block_fpi_info    |
description       | off: 46
block_data        | \x00002a00070010402630000070696400
block_fpi_data    |

此示例涉及一個僅包含一個塊引用的 WAL 記錄,但許多 WAL 記錄包含多個塊引用。pg_get_wal_block_info 輸出的行保證具有 start_lsnblock_id 值的唯一組合。

此處顯示的大部分資訊與使用相同引數時 pg_get_wal_records_info 的輸出相匹配。但是,pg_get_wal_block_info 將每個 WAL 記錄的資訊展開,每塊引用輸出一行,因此某些詳細資訊是在塊引用級別而不是整個記錄級別跟蹤的。這種結構對於跟蹤單個塊如何隨時間變化非常有用。請注意,沒有塊引用的記錄(例如 COMMIT WAL 記錄)將不會返回任何行,因此 pg_get_wal_block_info 實際上可能返回比 pg_get_wal_records_info 更少 的行。

reltablespacereldatabaserelfilenode 引數分別引用 pg_tablespace.oidpg_database.oidpg_class.relfilenoderelforknumber 欄位是塊引用中相對於關係的分叉號;有關詳細資訊,請參閱 common/relpath.h

提示

pg_filenode_relation 函式(請參閱 表 9.103)可以幫助您確定在原始執行期間修改了哪個關係。

客戶端可以避免物化塊資料的開銷。這可以顯著加快函式執行速度。當 show_data 設定為 false 時,將省略 block_datablock_fpi_data 值(即,對於所有返回的行,block_datablock_fpi_data OUT 引數為 NULL)。顯然,只有在不需要塊資料的查詢中,此最佳化才可行。

如果 start_lsn 不可用,該函式將引發錯誤。

pg_get_wal_stats(start_lsn pg_lsn, end_lsn pg_lsn, per_record boolean DEFAULT false) returns setof record #

獲取 start_lsnend_lsn 之間所有有效 WAL 記錄的統計資訊。預設情況下,它為每個 resource_manager 型別返回一行。當 per_record 設定為 true 時,它為每個 record_type 返回一行。例如:

postgres=# SELECT * FROM pg_get_wal_stats('0/1E847D00', '0/1E84F500')
           WHERE count > 0 AND
                 "resource_manager/record_type" = 'Transaction'
           LIMIT 1;
-[ RECORD 1 ]----------------+-------------------
resource_manager/record_type | Transaction
count                        | 2
count_percentage             | 8
record_size                  | 875
record_size_percentage       | 41.23468426013195
fpi_size                     | 0
fpi_size_percentage          | 0
combined_size                | 875
combined_size_percentage     | 2.8634072910530795

如果 start_lsn 不可用,該函式將引發錯誤。

F.37.2. 作者 #

Bharath Rupireddy

提交更正

如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。