W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
pageinspect
模塊提供函數(shù)讓你從低層次觀察數(shù)據(jù)庫頁面的內(nèi)容,這對(duì)于調(diào)試目的很有用。所有這些函數(shù)只能被超級(jí)用戶使用。
get_raw_page(relname text, fork text, blkno int) 返回 bytea
get_raw_page
讀取提及的關(guān)系中的指定塊并且以一個(gè)bytea
值的形式返回一個(gè)拷貝。這允許得到該塊的一個(gè)單一的時(shí)間一致的拷貝。對(duì)于主數(shù)據(jù)分叉,fork
應(yīng)該是'main'
,對(duì)于空閑空間映射應(yīng)該是'fsm'
,對(duì)于可見性映射應(yīng)該是
'vm'
,對(duì)于初始化分叉應(yīng)該是'init'
。
get_raw_page(relname text, blkno int) 返回 bytea
一個(gè)簡(jiǎn)寫版的get_raw_page
,用于讀取主分叉。等效于get_raw_page(relname, 'main', blkno)
page_header(page bytea) 返回 record
page_header
顯示所有PostgreSQL堆和索引頁面的公共域。
用get_raw_page
獲得的一個(gè)頁面映像應(yīng)該作為參數(shù)傳遞。例如:
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
返回的列對(duì)應(yīng)于PageHeaderData
結(jié)構(gòu)中的域。詳見src/include/storage/bufpage.h
。
checksum
域是存放在頁面中的校驗(yàn)和,如果頁面被損壞它可能是不正確的。如果對(duì)這個(gè)實(shí)例沒有啟用數(shù)據(jù)校驗(yàn)和,則存儲(chǔ)的這個(gè)值沒有意義。
page_checksum(page bytea, blkno int4) returns smallint
page_checksum
為頁面計(jì)算校驗(yàn)和,就像它被放置在給定塊上一樣。
應(yīng)該將get_raw_page
得到的頁面映像作為參數(shù)傳入。例如:
test=# SELECT page_checksum(get_raw_page('pg_class', 0), 0);
page_checksum
---------------
13443
注意校驗(yàn)和取決于塊號(hào),因此應(yīng)該將匹配的塊號(hào)傳入(除非在做調(diào)試)。
用這個(gè)函數(shù)計(jì)算的校驗(yàn)和可以拿來和函數(shù)page_header
的結(jié)果域checksum
進(jìn)行比較。如果為這個(gè)實(shí)例啟用了數(shù)據(jù)校驗(yàn)和,則兩個(gè)值應(yīng)該相等。
fsm_page_contents(page bytea) returns text
fsm_page_contents
顯示FSM頁面的內(nèi)部節(jié)點(diǎn)結(jié)構(gòu)。例如:
test=# SELECT fsm_page_contents(get_raw_page('pg_class', 'fsm', 0));
輸出為多行字符串,頁面中的二進(jìn)制樹中每個(gè)節(jié)點(diǎn)有一行。 僅有不為零的節(jié)點(diǎn)會(huì)被打印。 所謂的“next”指針,指向頁面中下一個(gè)要返回的槽,也會(huì)被打印。
FSM頁面結(jié)構(gòu)的更多信息可參見 src/backend/storage/freespace/README
。
heap_page_items(page bytea) 返回 setof record
heap_page_items
顯示一個(gè)堆頁面上所有的行指針。 對(duì)那些使用中的行指針,元組頭部和元組原始數(shù)據(jù)也會(huì)被顯示。 不管元組對(duì)于拷貝原始頁面時(shí)的 MVCC 快照是否可見,它們都會(huì)被顯示。
用get_raw_page
獲得的一個(gè)堆頁面映像應(yīng)該作為參數(shù)傳遞。例如:
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
函數(shù)可用于為堆元組解包t_infomask
和t_infomask2
的標(biāo)志位。
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
以后端內(nèi)部的相同方式將元組數(shù)據(jù)拆解成屬性。
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));
應(yīng)該用與heap_page_items
的返回屬性相同的參數(shù)來調(diào)用這個(gè)函數(shù)。
如果do_detoast
是true
,則根據(jù)需要將把屬性解除TOAST。默認(rèn)值為false
。
heap_page_item_attrs(page bytea, rel_oid regclass [, do_detoast bool]) returns setof record
heap_page_item_attrs
等效于 heap_page_items
,不過它會(huì)把元組原始數(shù)據(jù) 返回為屬性的數(shù)組,如果do_detoast
為真( 默認(rèn)為false
),這些屬性會(huì)被反 TOAST。
應(yīng)該把用get_raw_page
得到的一個(gè)堆頁面映像 作為參數(shù)傳入。例如:
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
解碼為一組由標(biāo)志 名稱組成的人類可讀數(shù)組, 一列用于所有標(biāo)志,一列用于組合標(biāo)志。 例如:
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;
應(yīng)該使用與heap_page_items
的返回屬性相同的參數(shù)調(diào)用此函數(shù)。
為考慮多個(gè)原始位值的源級(jí)宏顯示組合標(biāo)志,例如HEAP_XMIN_FROZEN
。
有關(guān)返回的標(biāo)志名稱的說明,請(qǐng)參閱src/include/access/htup_details.h
。
bt_metap(relname text) 返回 record
bt_metap
返回關(guān)于一個(gè)B樹索引元頁的信息。例如:
test=# SELECT * FROM bt_metap('pg_cast_oid_index');
-[ RECORD 1 ]-----------+-------
magic | 340322
version | 4
root | 1
level | 0
fastroot | 1
fastlevel | 0
oldest_xact | 582
last_cleanup_num_tuples | 1000
allequalimage | f
bt_page_stats(relname text, blkno int) 返回 record
bt_page_stats
返回有關(guān) B-樹索引單一頁面的總計(jì)信息。例如:
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 | 0
btpo_flags | 3
bt_page_items(relname text, blkno int) 返回 setof record
bt_page_items
返回一個(gè) B-樹索引頁面上項(xiàng)的所有細(xì)節(jié)信息。例如:
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)
這是一個(gè) B 樹的葉子頁面。 指向該表的所有元組恰好是發(fā)布列表元組(所有這些元組總共存儲(chǔ) 100 個(gè) 6 字節(jié) TID)。 在itemoffset
編號(hào) 1 處還有一個(gè)“high key”元組。 ctid
用于存儲(chǔ)本示例中每個(gè)元組的編碼信息,盡管葉頁元組通常將堆 TID 直接存儲(chǔ)在
ctid
字段中,而不是tids
是存儲(chǔ)為發(fā)布列表的 TID 列表。
在內(nèi)部頁面(未顯示)中,ctid
的塊號(hào)部分是一個(gè)“downlink”, 它是索引本身中另一個(gè)頁面的塊號(hào)。ctid
的偏移部分(第二個(gè)數(shù)字)存儲(chǔ)有關(guān)元組的編碼信息, 例如存在的列數(shù)(后綴截?cái)嗫赡芤褎h除不需要的后綴列)。截?cái)嗟牧斜灰暈榫哂兄?span id="m3c8yxg" class="quote">“minus infinity”。
htid
顯示元組的堆 TID,無論底層元組表示如何。 該值可能與ctid
匹配,或者可以從發(fā)布列表元組和 來自內(nèi)部頁面的元組所使用的替代表示中解碼。內(nèi)部頁面中的元組通常會(huì)截?cái)鄬?shí)現(xiàn)級(jí)別的 堆 TID 列,這表示為 NULLhtid
值。
注意在任何非最右頁面(頁面的btpo_next
域中有非零 值)上的第一個(gè)項(xiàng)是該頁的“high key”,表示它的 data
是作為該頁面上所有項(xiàng)的一個(gè)上界存在,而它的 ctid
字段不指向另一個(gè)塊。此外,在內(nèi)部頁面上,第一個(gè)真正的數(shù)據(jù)項(xiàng)(第一個(gè)不是高鍵的項(xiàng))可靠地將每一列都截?cái)嗔?,在? data
字段中沒有留下任何實(shí)際值。不過,這樣一個(gè)項(xiàng)確實(shí) 在其有ctid
域中有向下的鏈接。
有關(guān) B 樹索引結(jié)構(gòu)的更多詳細(xì)信息,請(qǐng)參閱第 63.4.1 節(jié)。 有關(guān)重復(fù)數(shù)據(jù)刪除和發(fā)布列表的更多詳細(xì)信息,請(qǐng)參閱第 63.4.2 節(jié)。
bt_page_items(page bytea) returns setof record
還可以把一個(gè)頁面以bytea
值的形式傳遞給bt_page_items
。應(yīng)該將get_raw_page
得到的頁面映像作為參數(shù)傳入。因此,上一個(gè)例子可以被重寫成這樣:
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)
所有其他細(xì)節(jié)和前一項(xiàng)中的解釋相同。
brin_page_type(page bytea) returns text
brin_page_type
返回一個(gè)給定的 BRIN索引頁面的頁面類型,如果該頁面不是 一個(gè)合法的BRIN頁面則拋出錯(cuò)誤。例如:
test=# SELECT brin_page_type(get_raw_page('brinidx', 0));
brin_page_type
----------------
meta
brin_metapage_info(page bytea) returns record
brin_metapage_info
返回有關(guān)一個(gè) 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
返回一個(gè) BRIN索引范圍映射頁面中元組標(biāo)識(shí)符的列表。 例如:
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
返回存儲(chǔ)在 BRIN數(shù)據(jù)頁面中存儲(chǔ)的數(shù)據(jù)。例如:
test=# SELECT * FROM brin_page_items(get_raw_page('brinidx', 5),
'brinidx')
ORDER BY blknum, attnum LIMIT 6;
itemoffset | blknum | attnum | allnulls | hasnulls | placeholder | value
------------+--------+--------+----------+----------+-------------+--------------
137 | 0 | 1 | t | f | f |
137 | 0 | 2 | f | f | f | {1 .. 88}
138 | 4 | 1 | t | f | f |
138 | 4 | 2 | f | f | f | {89 .. 176}
139 | 8 | 1 | t | f | f |
139 | 8 | 2 | f | f | f | {177 .. 264}
返回的列對(duì)應(yīng)于BrinMemTuple
和 BrinValues
結(jié)構(gòu)中的域。詳見 src/include/access/brin_tuple.h
。
gin_metapage_info(page bytea) returns record
gin_metapage_info
返回有關(guān)一個(gè) 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
返回有關(guān)一個(gè) GIN索引不透明區(qū)域的信息,如頁面類型等。例如:
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
返回有關(guān)存儲(chǔ)在一個(gè) GIN葉子頁面中的數(shù)據(jù)的信息。例如:
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)
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
返回有關(guān)一個(gè)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
返回有關(guān)一個(gè)HASH索引的桶頁或者溢出頁中存儲(chǔ)的數(shù)據(jù)的信息。例如:
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 int) returns record
hash_bitmap_info
返回HASH索引一個(gè)特定溢出頁在位圖頁中的位的狀態(tài)。例如:
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
返回一個(gè)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}
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: