pg_walinspect
模組提供 SQL 函數,可讓您在低階層級檢視執行中 PostgreSQL 資料庫叢集的預寫日誌的內容,這對於偵錯、分析、報告或教育目的很有用。它類似於 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
授予其他人存取權。
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_lsn
和 end_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_lsn
和 end_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_lsn
和 block_id
值的唯一組合。
此處顯示的許多資訊與 pg_get_wal_records_info
在給定相同引數的情況下會顯示的輸出相符。但是,pg_get_wal_block_info
透過為每個區塊參考輸出一個資料列,將來自每個 WAL 記錄的資訊取消巢狀到展開的形式,因此某些詳細資訊是在區塊參考層級而非在整個記錄層級追蹤的。此結構適用於追蹤個別區塊如何隨時間變更的查詢。請注意,沒有區塊參考的記錄(例如,COMMIT
WAL 記錄)將不會傳回任何資料列,因此 pg_get_wal_block_info
實際上可能會傳回較少的資料列,而不是 pg_get_wal_records_info
。
reltablespace
、reldatabase
和 relfilenode
參數分別參考 pg_tablespace
.oid
、pg_database
.oid
和 pg_class
.relfilenode
。relforknumber
欄位是區塊參考的關係中的分支編號;詳情請參閱 common/relpath.h
。
pg_filenode_relation
函數(請參閱表 9.101)可以幫助您確定在原始執行期間修改了哪個關係。
客戶端可以避免實現區塊資料的額外負擔。這可能會使函數執行速度更快。當 show_data
設定為 false
時,會省略 block_data
和 block_fpi_data
值(也就是說,所有傳回的資料列的 block_data
和 block_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_lsn
和 end_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
不可用,則函數會引發錯誤。
Bharath Rupireddy <bharath.rupireddyforpostgres@gmail.com>
如果您在文件中看到任何不正確、與您特定功能的經驗不符或需要進一步澄清的地方,請使用此表單回報文件問題。