pageinspect
模組提供了一些函式,允許您低級別地檢查資料庫頁面的內容,這對於除錯非常有用。所有這些函式只能由超級使用者使用。
get_raw_page(relname text, fork text, blkno bigint) returns bytea
get_raw_page
讀取指定關係(relation)的指定塊,並將其副本作為 bytea
值返回。這允許獲得一個時間一致的塊副本。 fork
對於主資料分叉(main data fork)應為 'main'
,對於空閒空間對映(free space map)應為 'fsm'
,對於可見性對映(visibility map)應為 'vm'
,或者對於初始化分叉(initialization fork)應為 '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 堆(heap)和索引(index)頁面共有的欄位。
應將使用 get_raw_page
獲得的頁面映像(page image)作為引數傳遞。例如:
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
獲得的頁面映像(page image)作為引數傳遞。例如:
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));
輸出是一個多行字串,頁面內的二叉樹中的每個節點佔一行。僅列印非零的節點。所謂的“next”指標,它指向從頁面返回的下一個槽,也會被打印出來。
有關頁面結構,請參見 src/backend/storage/freespace/README
。FSM頁面。
heap_page_items(page bytea) returns setof record
heap_page_items
顯示堆頁面上的所有行指標(line pointers)。對於正在使用的行指標,還會顯示元組頭(tuple headers)以及元組的原始資料。所有元組都會被顯示,無論在複製原始頁面時元組對 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
函式來解包堆元組的 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
以與後端內部相同的方式將元組資料分割成屬性(attributes)。
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
,則屬性將被解壓(detoasted)為需要。預設值為 false
。
heap_page_item_attrs(page bytea, rel_oid regclass [, do_detoast bool]) returns setof record
heap_page_item_attrs
等同於 heap_page_items
,但它返回元組的原始資料作為屬性陣列,該陣列可以根據 do_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 索引的元資料頁面(metapage)的資訊。例如:
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 葉子頁面。所有指向表(table)的元組碰巧是釋出列表元組(posting list tuples)(所有這些元組總共儲存 100 個 TIDs)。還有一個“高鍵”(high key)元組位於 itemoffset
號。在此示例中,ctid
用於儲存每個元組的編碼資訊,儘管葉子頁面的元組通常直接在 ctid
欄位中儲存堆 TID。 tids
是儲存為釋出列表的 TIDs 列表。
在一個內部頁面(未顯示)中,ctid
的塊號部分是“下行連結”(downlink),它是索引本身另一個頁面的塊號。 ctid
的偏移量部分(第二個數字)儲存了關於元組的編碼資訊,例如存在的列數(字尾截斷可能已刪除了不需要的字尾列)。截斷的列被視為具有“負無窮”(minus infinity)的值。
htid
顯示元組的堆 TID,而忽略底層元組表示。此值可能與 ctid
匹配,或者可能從釋出列表元組和內部頁面的元組使用的替代表示中解碼。內部頁面的元組通常會截斷實現級別的堆 TID 列,這表示為 NULL htid
值。
請注意,任何非最右頁(non-rightmost page)(btpo_next
欄位值為零的頁面)上的第一個項是該頁面的“高鍵”(high key),這意味著其 data
是頁面上所有項的上界,而其 ctid
欄位不指向另一個塊。另外,在內部頁面上,第一個實際資料項(不是高鍵的第一個項)可靠地將所有列截斷,在其 data
欄位中沒有實際值。然而,這樣的項在其 ctid
欄位中有一個有效的下行連結。
有關 B-tree 索引結構的更多詳細資訊,請參閱 第 65.1.4.1 節。有關去重(deduplication)和釋出列表的更多詳細資訊,請參閱 第 65.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索引範圍對映頁面的元組識別符號列表。例如:
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索引不透明區域(index opaque area)的資訊,例如頁面型別。例如:
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索引頁面的不透明區域(opaque area)的資訊,例如 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
返回關於 HASHHASH頁面中的資料資訊。例如:
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
返回關於 HASHHASH索引頁面的頁面型別。例如:
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
顯示特定溢位頁面的點陣圖頁面的位狀態。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
返回儲存在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}
如果您在文件中看到任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表格 報告文件問題。