F.21. pageinspect
Модуль pageinspect предоставляет функции, позволяющие исследовать страницы баз данных на низком уровне, что бывает полезно для отладки. Все эти функции могут вызывать только суперпользователи.
F.21.1. Функции
-  get_raw_page(relname text, fork text, blkno int) returns bytea
- Функция - get_raw_pageсчитывает указанный блок отношения с заданным именем и возвращает копию значения- bytea. Это позволяет получить одну согласованную во времени копию блока. В параметре- forkнужно передать- 'main', чтобы обратиться к основному слою данных,- 'fsm'— к карте свободного пространства,- 'vm'— к карте видимости, либо- 'init'— к слою инициализации.
-  get_raw_page(relname text, blkno int) 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 | 1 | 1 | 232 | 368 | 8192 | 8192 | 4 | 0- Возвращаемые столбцы соответствуют полям в структуре - PageHeaderData. За подробностями обратитесь к- src/include/storage/bufpage.h.
-  heap_page_items(page bytea) returns setof record
- Функция - heap_page_itemsпоказывает все указатели линейных блоков на странице кучи. Для используемых блоков также выводятся заголовки кортежей. При этом показываются все кортежи, независимо от того, были ли видны они в снимке 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.
-  bt_metap(relname text) returns record
- Функция - bt_metapвозвращает информацию о метастранице индекса-B-дерева. Например:- test=# SELECT * FROM bt_metap('pg_cast_oid_index'); -[ RECORD 1 ]----- magic | 340322 version | 2 root | 1 level | 0 fastroot | 1 fastlevel | 0
-  bt_page_stats(relname text, blkno int) returns record
- bt_page_statsвозвращает сводную информацию по единичным страницам B-дерева. Например:- test=# SELECT * FROM bt_page_stats('pg_cast_oid_index', 1); -[ RECORD 1 ]-+----- blkno | 1 type | l live_items | 256 dead_items | 0 avg_item_size | 12 page_size | 8192 free_size | 4056 btpo_prev | 0 btpo_next | 0 btpo | 0 btpo_flags | 3
-  bt_page_items(relname text, blkno int) returns setof record
- bt_page_itemsвозвращает детализированную информацию обо всех элементах на странице B-дерева. Например:- test=# SELECT * FROM bt_page_items('pg_cast_oid_index', 1); itemoffset | ctid | itemlen | nulls | vars | data ------------+---------+---------+-------+------+------------- 1 | (0,1) | 12 | f | f | 23 27 00 00 2 | (0,2) | 12 | f | f | 24 27 00 00 3 | (0,3) | 12 | f | f | 25 27 00 00 4 | (0,4) | 12 | f | f | 26 27 00 00 5 | (0,5) | 12 | f | f | 27 27 00 00 6 | (0,6) | 12 | f | f | 28 27 00 00 7 | (0,7) | 12 | f | f | 29 27 00 00 8 | (0,8) | 12 | f | f | 2a 27 00 00- На странице уровня листьев B-дерева, - ctidуказывает на кортеж в куче. На внутренней странице часть- ctid, содержащая номер блока, указывает на другую страницу в самом индексе, а часть смещения (второе число) игнорируется и обычно равняется 1.- Заметьте, что первый элемент в любой, кроме самой правой, странице (то есть в любой странице с ненулевым значением в поле - btpo_next) представляет собой «верхний ключ», то есть его поле- dataзадаёт верхнюю границу для всех элементов, находящихся на странице, а поле- ctidлишено смысла. Кроме того, на внутренних страницах первый действительный элемент данных (первый элемент после верхнего ключа) представляет элемент «минус бесконечность», без фактического значения в поле- data. Однако такой элемент содержит в своём поле- ctidкорректную ссылку на данные.
-  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 | 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}- Возвращаемые столбцы соответствуют полям в структурах - 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)
-  fsm_page_contents(page bytea) returns text
- Функция - fsm_page_contentsпоказывает внутреннюю структуру узла на странице FSM. Она выдаёт текст из нескольких строк, по одной строке на узел двоичного дерева на заданной странице. При этом выдаются только ненулевые узлы. Также выводится так называемый указатель «следующего слота», который указывает на следующий слот, получаемый с этой страницы.- Подробнее структура страницы FSM описана в - src/backend/storage/freespace/README.