F.49. pg_walinspect — низкоуровневая проверка WAL#
F.49. pg_walinspect — низкоуровневая проверка WAL #
Модуль pg_walinspect
предоставляет SQL-функции, которые позволяют вам осмотреть содержимое журнала предварительной записи (write-ahead log) работающего кластера баз данных Tantor BE на низком уровне, что полезно для отладки, аналитических, отчетных или образовательных целей. Он похож на pg_waldump, но доступен через SQL, а не отдельную утилиту.
Все функции этого модуля будут предоставлять информацию WAL, используя текущий идентификатор временной шкалы сервера.
Примечание
Функции pg_walinspect
часто вызываются
с аргументом LSN, который указывает местоположение, где начинается
известная запись WAL начинается. Однако некоторые
функции, такие как
pg_logical_emit_message
,
возвращают LSN после записи, которая была только что
вставлена.
Подсказка
Все функции pg_walinspect
, которые показывают
информацию о записях, попадающих в определенный диапазон LSN,
допускают аргументы end_lsn
, которые
находятся после текущего LSN сервера. Использование
end_lsn
“из будущего”
не вызовет ошибку.
Это может быть удобно указать значение
FFFFFFFF/FFFFFFFF
(максимально допустимое
значение pg_lsn
) в качестве аргумента end_lsn
.
Это эквивалентно указанию аргумента end_lsn
, соответствующего
текущему LSN сервера.
По умолчанию, использование этих функций ограничено суперпользователями и членами роли pg_read_server_files
. Доступ может быть предоставлен другим пользователям суперпользователями с помощью команды GRANT
.
F.49.1. Общие функции #
-
pg_get_wal_record_info(in_lsn pg_lsn) returns record
# Получает информацию о записи WAL о записи, которая находится на или после аргумента
in_lsn
. Например: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
# Получает информацию обо всех допустимых записях WAL между
start_lsn
иend_lsn
. Возвращает одну строку на каждую запись 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
# Получает информацию о каждой ссылке на блок из всех допустимых WAL-записей между
start_lsn
иend_lsn
с одной или несколькими ссылками на блок. Возвращает одну строку на каждую ссылку на блок для каждой 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.97) может помочь вам определить, какое отношение было изменено во время первоначального выполнения.Клиенты могут избежать накладных расходов на материализацию данных блоков. Это может значительно ускорить выполнение функции. Когда
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
# Получает статистику всех допустимых записей WAL между
start_lsn
иend_lsn
. По умолчанию возвращает одну строку на каждый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
недоступен.
F.49.2. Автор #
Bharath Rupireddy <bharath.rupireddyforpostgres@gmail.com>