pageinspect
模組提供一些函數,讓您可以從低階檢視資料庫頁面的內容,這對於除錯很有用。所有這些函數只能由超級使用者使用。
get_raw_page(relname text, fork text, blkno bigint) returns bytea
get_raw_page
讀取指定關聯的指定區塊,並以 bytea
值傳回副本。這允許取得區塊單一時間一致的副本。fork
應該是主要資料分叉的 'main'
、可用空間對應的 'fsm'
、可見性對應的 'vm'
,或是初始化分叉的 'init'
。
get_raw_page(relname text, blkno bigint) returns bytea
從主要分叉讀取的 get_raw_page
的簡短版本。相當於 get_raw_page(relname, 'main', blkno)
page_header(page bytea) returns record
page_header
顯示 PostgreSQL 堆積和索引頁面通用的欄位。
應將使用 get_raw_page
取得的頁面映像檔作為引數傳遞。例如
test=# SELECT * FROM page_header(get_raw_page('pg_class', 0)); lsn | checksum | flags | lower | upper | special | pagesize | version | prune_xid -----------+----------+--------+-------+-------+---------+----------+---------+----------- 0/24A1B50 | 0 | 1 | 232 | 368 | 8192 | 8192 | 4 | 0
傳回的欄與 PageHeaderData
結構中的欄位對應。如需詳細資訊,請參閱 src/include/storage/bufpage.h
。
checksum
欄位是儲存在頁面中的檢查總和,如果頁面以某種方式損毀,則可能不正確。如果未針對此執行個體啟用資料檢查總和,則儲存的值沒有意義。
page_checksum(page bytea, blkno bigint) returns smallint
page_checksum
計算頁面的檢查總和,就好像它位於給定的區塊一樣。
應將使用 get_raw_page
取得的頁面映像檔作為引數傳遞。例如
test=# SELECT page_checksum(get_raw_page('pg_class', 0), 0); page_checksum --------------- 13443
請注意,檢查總和取決於區塊編號,因此應傳遞相符的區塊編號(除非進行深奧的除錯)。
可以使用函數 page_header
的 checksum
結果欄位,來比較使用此函數計算的檢查總和。如果已針對此執行個體啟用資料檢查總和,則這兩個值應該相等。
fsm_page_contents(page bytea) returns text
fsm_page_contents
顯示FSM頁面的內部節點結構。例如
test=# SELECT fsm_page_contents(get_raw_page('pg_class', 'fsm', 0));
輸出是一個多行字串,每行對應於頁面中二元樹中的一個節點。只會列印非零的節點。還會列印所謂的「下一個」指標,該指標指向要從頁面傳回的下一個位置。
如需 FSM 頁面結構的詳細資訊,請參閱 src/backend/storage/freespace/README
。FSM頁面。
heap_page_items(page bytea) returns setof record
heap_page_items
顯示堆積頁面上的所有行指標。對於正在使用的行指標,也會顯示 Tuple 標頭以及 Tuple 原始資料。將顯示所有 Tuple,無論 Tuple 在複製原始頁面時,對於 MVCC 快照是否可見。
應將使用 get_raw_page
取得的堆積頁面映像檔作為引數傳遞。例如
test=# SELECT * FROM heap_page_items(get_raw_page('pg_class', 0));
如需傳回欄位的說明,請參閱 src/include/storage/itemid.h
和 src/include/access/htup_details.h
。
可以使用 heap_tuple_infomask_flags
函數來解壓縮堆積 Tuple 的 t_infomask
和 t_infomask2
的旗標位元。
tuple_data_split(rel_oid oid, t_data bytea, t_infomask integer, t_infomask2 integer, t_bits text [, do_detoast bool]) returns bytea[]
tuple_data_split
以與後端內部元件相同的方式,將 Tuple 資料分割成屬性。
test=# SELECT tuple_data_split('pg_class'::regclass, t_data, t_infomask, t_infomask2, t_bits) FROM heap_page_items(get_raw_page('pg_class', 0));
應使用與 heap_page_items
的傳回屬性相同的引數呼叫此函數。
如果 do_detoast
為 true
,則將視需要對屬性進行 Detoast 處理。預設值為 false
。
heap_page_item_attrs(page bytea, rel_oid regclass [, do_detoast bool]) returns setof record
heap_page_item_attrs
的功能與 heap_page_items
相同,差別在於它會回傳 Tuple 原始資料,以屬性陣列的形式呈現,並且可以選擇性地使用 do_detoast
參數來進行 detoast 解壓縮,預設值為 false
。
應將使用 get_raw_page
取得的堆積頁面映像檔作為引數傳遞。例如
test=# SELECT * FROM heap_page_item_attrs(get_raw_page('pg_class', 0), 'pg_class'::regclass);
heap_tuple_infomask_flags(t_infomask integer, t_infomask2 integer) returns record
heap_tuple_infomask_flags
會將 heap_page_items
回傳的 t_infomask
和 t_infomask2
解碼為人類可讀的旗標名稱陣列,其中一欄包含所有旗標,另一欄包含組合旗標。例如:
test=# SELECT t_ctid, raw_flags, combined_flags FROM heap_page_items(get_raw_page('pg_class', 0)), LATERAL heap_tuple_infomask_flags(t_infomask, t_infomask2) WHERE t_infomask IS NOT NULL OR t_infomask2 IS NOT NULL;
應使用與 heap_page_items
的傳回屬性相同的引數呼叫此函數。
組合旗標會針對考慮多個原始位元值的原始碼層級巨集顯示,例如 HEAP_XMIN_FROZEN
。
關於傳回的旗標名稱的說明,請參閱 src/include/access/htup_details.h
。
bt_metap(relname text) returns record
bt_metap
會傳回有關 B-tree 索引元頁面的資訊。例如:
test=# SELECT * FROM bt_metap('pg_cast_oid_index'); -[ RECORD 1 ]-------------+------- magic | 340322 version | 4 root | 1 level | 0 fastroot | 1 fastlevel | 0 last_cleanup_num_delpages | 0 last_cleanup_num_tuples | 230 allequalimage | f
bt_page_stats(relname text, blkno bigint) returns record
bt_page_stats
會傳回有關 B-tree 索引資料頁面的摘要資訊。例如:
test=# SELECT * FROM bt_page_stats('pg_cast_oid_index', 1); -[ RECORD 1 ]-+----- blkno | 1 type | l live_items | 224 dead_items | 0 avg_item_size | 16 page_size | 8192 free_size | 3668 btpo_prev | 0 btpo_next | 0 btpo_level | 0 btpo_flags | 3
bt_multi_page_stats(relname text, blkno bigint, blk_count bigint) returns setof record
bt_multi_page_stats
傳回與 bt_page_stats
相同的資訊,但會針對從 blkno
開始並延伸 blk_count
頁面的頁面範圍中的每個頁面執行此操作。如果 blk_count
為負數,則會報告從 blkno
到索引結尾的所有頁面。例如:
test=# SELECT * FROM bt_multi_page_stats('pg_proc_oid_index', 5, 2); -[ RECORD 1 ]-+----- blkno | 5 type | l live_items | 367 dead_items | 0 avg_item_size | 16 page_size | 8192 free_size | 808 btpo_prev | 4 btpo_next | 6 btpo_level | 0 btpo_flags | 1 -[ RECORD 2 ]-+----- blkno | 6 type | l live_items | 367 dead_items | 0 avg_item_size | 16 page_size | 8192 free_size | 808 btpo_prev | 5 btpo_next | 7 btpo_level | 0 btpo_flags | 1
bt_page_items(relname text, blkno bigint) returns setof record
bt_page_items
會傳回有關 B-tree 索引頁面上所有項目的詳細資訊。例如:
test=# SELECT itemoffset, ctid, itemlen, nulls, vars, data, dead, htid, tids[0:2] AS some_tids FROM bt_page_items('tenk2_hundred', 5); itemoffset | ctid | itemlen | nulls | vars | data | dead | htid | some_tids ------------+-----------+---------+-------+------+-------------------------+------+--------+--------------------- 1 | (16,1) | 16 | f | f | 30 00 00 00 00 00 00 00 | | | 2 | (16,8292) | 616 | f | f | 24 00 00 00 00 00 00 00 | f | (1,6) | {"(1,6)","(10,22)"} 3 | (16,8292) | 616 | f | f | 25 00 00 00 00 00 00 00 | f | (1,18) | {"(1,18)","(4,22)"} 4 | (16,8292) | 616 | f | f | 26 00 00 00 00 00 00 00 | f | (4,18) | {"(4,18)","(6,17)"} 5 | (16,8292) | 616 | f | f | 27 00 00 00 00 00 00 00 | f | (1,2) | {"(1,2)","(1,19)"} 6 | (16,8292) | 616 | f | f | 28 00 00 00 00 00 00 00 | f | (2,24) | {"(2,24)","(4,11)"} 7 | (16,8292) | 616 | f | f | 29 00 00 00 00 00 00 00 | f | (2,17) | {"(2,17)","(11,2)"} 8 | (16,8292) | 616 | f | f | 2a 00 00 00 00 00 00 00 | f | (0,25) | {"(0,25)","(3,20)"} 9 | (16,8292) | 616 | f | f | 2b 00 00 00 00 00 00 00 | f | (0,10) | {"(0,10)","(0,14)"} 10 | (16,8292) | 616 | f | f | 2c 00 00 00 00 00 00 00 | f | (1,3) | {"(1,3)","(3,9)"} 11 | (16,8292) | 616 | f | f | 2d 00 00 00 00 00 00 00 | f | (6,28) | {"(6,28)","(11,1)"} 12 | (16,8292) | 616 | f | f | 2e 00 00 00 00 00 00 00 | f | (0,27) | {"(0,27)","(1,13)"} 13 | (16,8292) | 616 | f | f | 2f 00 00 00 00 00 00 00 | f | (4,17) | {"(4,17)","(4,21)"} (13 rows)
這是一個 B-tree 葉節點頁面。所有指向資料表的 Tuple 碰巧都是發布清單 Tuple(全部儲存總共 100 個 6 位元組的 TID)。在 itemoffset
編號 1 也有一個“高鍵” Tuple。在本範例中,ctid
用於儲存有關每個 Tuple 的編碼資訊,但葉節點頁面 Tuple 通常會直接在 ctid
欄位中儲存 Heap TID。tids
是儲存為發布清單的 TID 清單。
在內部頁面(未顯示)中,ctid
的區塊編號部分是一個“下行鏈路”,它是索引本身另一個頁面的區塊編號。ctid
的偏移部分(第二個數字)儲存有關 Tuple 的編碼資訊,例如存在的欄數(後綴截斷可能已移除不必要的後綴欄)。截斷的欄會被視為具有“負無限大”的值。
htid
顯示 Tuple 的 Heap TID,無論底層 Tuple 表示形式如何。此值可能與 ctid
相符,或者可以從發布清單 Tuple 和內部頁面 Tuple 使用的替代表示形式解碼。內部頁面中的 Tuple 通常會截斷實作層級的 Heap TID 欄,表示為 NULL htid
值。
請注意,任何非最右邊頁面(btpo_next
欄位中具有非零值的任何頁面)上的第一個項目都是頁面的“高鍵”,這表示其 data
用作頁面上顯示的所有項目的上限,而其 ctid
欄位不指向另一個區塊。此外,在內部頁面上,第一個真正的資料項目(不是高鍵的第一個項目)可靠地截斷每個欄,使其 data
欄位中沒有實際值。但是,此類項目在其 ctid
欄位中具有有效的下行鏈路。
有關 B-tree 索引結構的更多詳細資訊,請參閱第 64.1.4.1 節。有關重複資料刪除和發布清單的更多詳細資訊,請參閱第 64.1.4.3 節。
bt_page_items(page bytea) returns setof record
也可以將頁面作為 bytea
值傳遞給 bt_page_items
。應傳遞使用 get_raw_page
獲得的頁面影像作為參數。因此,最後一個範例也可以像這樣重寫:
test=# SELECT itemoffset, ctid, itemlen, nulls, vars, data, dead, htid, tids[0:2] AS some_tids FROM bt_page_items(get_raw_page('tenk2_hundred', 5)); itemoffset | ctid | itemlen | nulls | vars | data | dead | htid | some_tids ------------+-----------+---------+-------+------+-------------------------+------+--------+--------------------- 1 | (16,1) | 16 | f | f | 30 00 00 00 00 00 00 00 | | | 2 | (16,8292) | 616 | f | f | 24 00 00 00 00 00 00 00 | f | (1,6) | {"(1,6)","(10,22)"} 3 | (16,8292) | 616 | f | f | 25 00 00 00 00 00 00 00 | f | (1,18) | {"(1,18)","(4,22)"} 4 | (16,8292) | 616 | f | f | 26 00 00 00 00 00 00 00 | f | (4,18) | {"(4,18)","(6,17)"} 5 | (16,8292) | 616 | f | f | 27 00 00 00 00 00 00 00 | f | (1,2) | {"(1,2)","(1,19)"} 6 | (16,8292) | 616 | f | f | 28 00 00 00 00 00 00 00 | f | (2,24) | {"(2,24)","(4,11)"} 7 | (16,8292) | 616 | f | f | 29 00 00 00 00 00 00 00 | f | (2,17) | {"(2,17)","(11,2)"} 8 | (16,8292) | 616 | f | f | 2a 00 00 00 00 00 00 00 | f | (0,25) | {"(0,25)","(3,20)"} 9 | (16,8292) | 616 | f | f | 2b 00 00 00 00 00 00 00 | f | (0,10) | {"(0,10)","(0,14)"} 10 | (16,8292) | 616 | f | f | 2c 00 00 00 00 00 00 00 | f | (1,3) | {"(1,3)","(3,9)"} 11 | (16,8292) | 616 | f | f | 2d 00 00 00 00 00 00 00 | f | (6,28) | {"(6,28)","(11,1)"} 12 | (16,8292) | 616 | f | f | 2e 00 00 00 00 00 00 00 | f | (0,27) | {"(0,27)","(1,13)"} 13 | (16,8292) | 616 | f | f | 2f 00 00 00 00 00 00 00 | f | (4,17) | {"(4,17)","(4,21)"} (13 rows)
所有其他細節與前一個項目中解釋的相同。
brin_page_type(page bytea) returns text
brin_page_type
會傳回給定的頁面類型。BRIN索引頁面,如果該頁面不是有效的頁面,則會擲回錯誤。BRIN頁面的內部節點結構。例如
test=# SELECT brin_page_type(get_raw_page('brinidx', 0)); brin_page_type ---------------- meta
brin_metapage_info(page bytea) returns record
brin_metapage_info
會傳回關於BRIN索引元頁面的各種資訊。例如:
test=# SELECT * FROM brin_metapage_info(get_raw_page('brinidx', 0)); magic | version | pagesperrange | lastrevmappage ------------+---------+---------------+---------------- 0xA8109CFA | 1 | 4 | 2
brin_revmap_data(page bytea) returns setof tid
brin_revmap_data
會傳回一個BRIN索引範圍對應頁面中的 Tuple 識別碼清單。例如:
test=# SELECT * FROM brin_revmap_data(get_raw_page('brinidx', 2)) LIMIT 5; pages --------- (6,137) (6,138) (6,139) (6,140) (6,141)
brin_page_items(page bytea, index oid) returns setof record
brin_page_items
會傳回儲存在BRIN資料頁面中的資料。例如:
test=# SELECT * FROM brin_page_items(get_raw_page('brinidx', 5), 'brinidx') ORDER BY blknum, attnum LIMIT 6; itemoffset | blknum | attnum | allnulls | hasnulls | placeholder | empty | value ------------+--------+--------+----------+----------+-------------+-------+-------------- 137 | 0 | 1 | t | f | f | f | 137 | 0 | 2 | f | f | f | f | {1 .. 88} 138 | 4 | 1 | t | f | f | f | 138 | 4 | 2 | f | f | f | f | {89 .. 176} 139 | 8 | 1 | t | f | f | f | 139 | 8 | 2 | f | f | f | f | {177 .. 264}
傳回的欄對應於 BrinMemTuple
和 BrinValues
結構中的欄位。 有關詳細資訊,請參閱 src/include/access/brin_tuple.h
。
gin_metapage_info(page bytea) returns record
gin_metapage_info
會傳回關於GIN索引元頁面的各種資訊。例如:
test=# SELECT * FROM gin_metapage_info(get_raw_page('gin_index', 0)); -[ RECORD 1 ]----+----------- pending_head | 4294967295 pending_tail | 4294967295 tail_free_size | 0 n_pending_pages | 0 n_pending_tuples | 0 n_total_pages | 7 n_entry_pages | 6 n_data_pages | 0 n_entries | 693 version | 2
gin_page_opaque_info(page bytea) returns record
gin_page_opaque_info
會傳回關於GIN索引不透明區域的資訊,例如頁面類型。例如:
test=# SELECT * FROM gin_page_opaque_info(get_raw_page('gin_index', 2)); rightlink | maxoff | flags -----------+--------+------------------------ 5 | 0 | {data,leaf,compressed} (1 row)
gin_leafpage_items(page bytea) returns setof record
gin_leafpage_items
會傳回有關儲存在壓縮GIN葉節點頁面中的資料的資訊。例如:
test=# SELECT first_tid, nbytes, tids[0:5] AS some_tids FROM gin_leafpage_items(get_raw_page('gin_test_idx', 2)); first_tid | nbytes | some_tids -----------+--------+---------------------------------------------------------- (8,41) | 244 | {"(8,41)","(8,43)","(8,44)","(8,45)","(8,46)"} (10,45) | 248 | {"(10,45)","(10,46)","(10,47)","(10,48)","(10,49)"} (12,52) | 248 | {"(12,52)","(12,53)","(12,54)","(12,55)","(12,56)"} (14,59) | 320 | {"(14,59)","(14,60)","(14,61)","(14,62)","(14,63)"} (167,16) | 376 | {"(167,16)","(167,17)","(167,18)","(167,19)","(167,20)"} (170,30) | 376 | {"(170,30)","(170,31)","(170,32)","(170,33)","(170,34)"} (173,44) | 197 | {"(173,44)","(173,45)","(173,46)","(173,47)","(173,48)"} (7 rows)
gist_page_opaque_info(page bytea) returns record
gist_page_opaque_info
傳回來自於GiST索引頁面不透明區域的資訊,例如 NSN、rightlink 和頁面類型。舉例來說:
test=# SELECT * FROM gist_page_opaque_info(get_raw_page('test_gist_idx', 2)); lsn | nsn | rightlink | flags -----+-----+-----------+-------- 0/1 | 0/0 | 1 | {leaf} (1 row)
gist_page_items(page bytea, index_oid regclass) returns setof record
gist_page_items
傳回關於儲存在GiST索引頁面中的資料的資訊。舉例來說:
test=# SELECT * FROM gist_page_items(get_raw_page('test_gist_idx', 0), 'test_gist_idx'); itemoffset | ctid | itemlen | dead | keys ------------+-----------+---------+------+------------------------------- 1 | (1,65535) | 40 | f | (p)=("(185,185),(1,1)") 2 | (2,65535) | 40 | f | (p)=("(370,370),(186,186)") 3 | (3,65535) | 40 | f | (p)=("(555,555),(371,371)") 4 | (4,65535) | 40 | f | (p)=("(740,740),(556,556)") 5 | (5,65535) | 40 | f | (p)=("(870,870),(741,741)") 6 | (6,65535) | 40 | f | (p)=("(1000,1000),(871,871)") (6 rows)
gist_page_items_bytea(page bytea) returns setof record
與 gist_page_items
相同,但將鍵值資料以原始 bytea
blob 格式傳回。由於它不嘗試解碼鍵值,因此不需要知道涉及哪個索引。舉例來說:
test=# SELECT * FROM gist_page_items_bytea(get_raw_page('test_gist_idx', 0)); itemoffset | ctid | itemlen | dead | key_data ------------+-----------+---------+------+------------------------------------------------------------------------------------ 1 | (1,65535) | 40 | f | \x00000100ffff28000000000000c064400000000000c06440000000000000f03f000000000000f03f 2 | (2,65535) | 40 | f | \x00000200ffff28000000000000c074400000000000c074400000000000e064400000000000e06440 3 | (3,65535) | 40 | f | \x00000300ffff28000000000000207f400000000000207f400000000000d074400000000000d07440 4 | (4,65535) | 40 | f | \x00000400ffff28000000000000c084400000000000c084400000000000307f400000000000307f40 5 | (5,65535) | 40 | f | \x00000500ffff28000000000000f089400000000000f089400000000000c884400000000000c88440 6 | (6,65535) | 40 | f | \x00000600ffff28000000000000208f400000000000208f400000000000f889400000000000f88940 7 | (7,65535) | 40 | f | \x00000700ffff28000000000000408f400000000000408f400000000000288f400000000000288f40 (7 rows)
hash_page_type(page bytea) returns text
hash_page_type
傳回給定HASH索引頁面的頁面類型。舉例來說:
test=# SELECT hash_page_type(get_raw_page('con_hash_index', 0)); hash_page_type ---------------- metapage
hash_page_stats(page bytea) returns setof record
hash_page_stats
傳回關於HASH索引頁面中的資料的資訊。舉例來說:
test=# SELECT * FROM hash_page_stats(get_raw_page('con_hash_index', 1)); -[ RECORD 1 ]---+----------- live_items | 407 dead_items | 0 page_size | 8192 free_size | 8 hasho_prevblkno | 4096 hasho_nextblkno | 8474 hasho_bucket | 0 hasho_flag | 66 hasho_page_id | 65408
hash_page_items(page bytea) returns setof record
hash_page_items
傳回關於儲存在 bucket 或 overflow 頁面中的資料的資訊。HASH索引頁面的頁面類型。舉例來說:
test=# SELECT * FROM hash_page_items(get_raw_page('con_hash_index', 1)) LIMIT 5; itemoffset | ctid | data ------------+-----------+------------ 1 | (899,77) | 1053474816 2 | (897,29) | 1053474816 3 | (894,207) | 1053474816 4 | (892,159) | 1053474816 5 | (890,111) | 1053474816
hash_bitmap_info(index oid, blkno bigint) returns record
hash_bitmap_info
顯示 bitmap 頁面中,對於特定 overflow 頁面的 bit 狀態。HASH索引頁面中的資料的資訊。舉例來說:
test=# SELECT * FROM hash_bitmap_info('con_hash_index', 2052); bitmapblkno | bitmapbit | bitstatus -------------+-----------+----------- 65 | 3 | t
hash_metapage_info(page bytea) returns record
hash_metapage_info
傳回儲存在 meta 頁面中的資訊。HASH索引頁面中的資料的資訊。舉例來說:
test=# SELECT magic, version, ntuples, ffactor, bsize, bmsize, bmshift, test-# maxbucket, highmask, lowmask, ovflpoint, firstfree, nmaps, procid, test-# regexp_replace(spares::text, '(,0)*}', '}') as spares, test-# regexp_replace(mapp::text, '(,0)*}', '}') as mapp test-# FROM hash_metapage_info(get_raw_page('con_hash_index', 0)); -[ RECORD 1 ]------------------------------------------------------------------------------- magic | 105121344 version | 4 ntuples | 500500 ffactor | 40 bsize | 8152 bmsize | 4096 bmshift | 15 maxbucket | 12512 highmask | 16383 lowmask | 8191 ovflpoint | 28 firstfree | 1204 nmaps | 1 procid | 450 spares | {0,0,0,0,0,0,1,1,1,1,1,1,1,1,3,4,4,4,45,55,58,59,508,567,628,704,1193,1202,1204} mapp | {65}
如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清的地方,請使用 此表單 回報文件問題。