pg_walinspect — низкоуровневый анализ WAL#
Примечание
Эта страница переведена при помощи нейросети GigaChat.
Модуль pg_walinspect предоставляет SQL-функции, позволяющие исследовать содержимое журнала упреждающей записи работающего кластера баз данных PostgreSQL на низком уровне, что полезно для отладки, анализа, отчетности или образовательных целей. Он похож на pg_waldump, но доступен через SQL, а не через отдельную утилиту.
Все функции данного модуля предоставляют информацию из журнала упреждающей записи, используя текущий идентификатор временной шкалы сервера.
Примечание
Функции pg_walinspect часто вызываются с аргументом LSN, который указывает местоположение известной записи журнала упреждающей записи, которая начинается. Однако некоторые функции, например 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.
Общие функции#
pg_get_wal_record_info(in_lsn pg_lsn) returns recordПолучает информацию о записи журнала упреждающей записи, расположенной по адресу или после аргумента
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не находится в начале записи журнала упреждающей записи, вместо него отображается информация о следующей действительной записи журнала упреждающей записи. Если следующая действительная запись журнала упреждающей записи отсутствует, функция вызывает ошибку.
pg_get_wal_records_info(start_lsn pg_lsn, end_lsn pg_lsn) returns setof recordПолучает информацию обо всех действительных записях журнала упреждающей записи между
start_lsnиend_lsn. Возвращает одну строку на каждую запись журнала упреждающей записи. Например: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Получает информацию о каждой ссылке на блок из всех действительных записей журнала упреждающей записи между
start_lsnиend_lsn, содержащих одну или несколько ссылок на блоки. Возвращает одну строку на каждую ссылку на блок на каждую запись журнала упреждающей записи. Например: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 |В этом примере речь идет о записи журнала упреждающей записи, содержащей всего одну ссылку на блок, однако многие записи журнала упреждающей записи содержат несколько ссылок на блоки. Строки, выводимые функцией
pg_get_wal_block_info, гарантированно имеют уникальное сочетание значенийstart_lsnиblock_id.Большая часть информации, представленной здесь, соответствует тому, что было бы показано при использовании
pg_get_wal_records_infoс теми же аргументами. Однакоpg_get_wal_block_infoразворачивает информацию из каждой записи журнала упреждающей записи в расширенную форму путем вывода одной строки на каждую ссылку на блок, поэтому определенные детали отслеживаются на уровне ссылки на блок, а не на уровне всей записи. Такая структура полезна при запросах, отслеживающих, как изменялись отдельные блоки со временем. Обратите внимание, что записи без ссылок на блоки (например, записи журнала упреждающей записи типаCOMMIT) не будут иметь возвращаемых строк, так чтоpg_get_wal_block_infoфактически может вернуть меньше строк, чемpg_get_wal_records_info.Параметры
reltablespace,reldatabase, иrelfilenodeссылаются соответственно на pg_tablespace.oid, pg_database.oid, и pg_class.relfilenode. Полеrelforknumberпредставляет собой номер вилки внутри отношения для ссылки на блок.Совет
Функция
pg_filenode_relationпоможет определить, какое отношение было модифицировано во время первоначального выполнения.Клиенты могут избежать накладных расходов на материализацию данных блоков. Это может значительно ускорить выполнение функции. Когда параметр
show_dataустановлен вfalse, значенияblock_dataиblock_fpi_dataопускаются (то есть аргументыblock_dataиblock_fpi_dataOUTравныNULLдля всех возвращенных строк). Очевидно, такая оптимизация возможна только в тех запросах, где данные блока действительно не требуются.Функция вызывает ошибку, если аргумент
start_lsnнедоступен.
pg_get_wal_stats(start_lsn pg_lsn, end_lsn pg_lsn, per_record boolean DEFAULT false) returns setof recordПолучает статистику всех действительных записей журнала упреждающей записи между
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недоступен.