F.64. pg_walinspect — просмотр журнала предзаписи на низком уровне #
Модуль pg_walinspect
предоставляет SQL-функции для просмотра журнала предзаписи на низком уровне. Он работает с запущенным кластером баз данных Postgres Pro и может быть полезен для целей отладки, анализа, отчётности или обучения. Модуль похож на pg_waldump, но работает через SQL, а не как отдельная утилита.
Все функции этого модуля выдают информацию из WAL, относящуюся к текущей линии времени сервера.
Примечание
Функции pg_walinspect
зачастую вызываются с аргументом LSN, который задаёт начало интересующей записи WAL. Тем не менее некоторые функции, например pg_logical_emit_message
, возвращают LSN после только что добавленной записи.
Подсказка
Все функции pg_walinspect
, которые показывают информацию о записях, попадающих в определённый диапазон значений LSN, могут принимать конечные_lsn
после текущего LSN сервера. При использовании конечного_lsn
«из будущего» ошибки не возникнет.
Может быть удобным указать значение FFFFFFFF/FFFFFFFF
(максимально допустимое значение pg_lsn
) в качестве аргумента конечного_lsn
. Это аналогично варианту указать конечный_lsn
, совпадающий с текущим LSN сервера.
По умолчанию использовать эти функции разрешено только суперпользователям и ролям, включённым в роль pg_read_server_files
. Суперпользователь может дать доступ другим, воспользовавшись командой GRANT
.
F.64.1. Функции общего назначения #
-
pg_get_wal_record_info(in_lsn pg_lsn) returns record
# Получает информацию о записи WAL, которая расположена по
заданному_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
Если
заданный_lsn
не находится в начале записи WAL, будет показана информация о следующей корректной записи WAL. Если такой записи WAL нет, функция выдаст ошибку.-
pg_get_wal_records_info(start_lsn pg_lsn, end_lsn pg_lsn) returns setof record
# Получает информацию обо всех корректных записях WAL между
начальным_lsn
иконечным_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 |
Функция выдаёт ошибку, если
начальный_lsn
недоступен.-
pg_get_wal_block_info(start_lsn pg_lsn, end_lsn pg_lsn, show_data boolean DEFAULT true) returns setof record
# Получает информацию о каждой ссылке на блок из всех корректных записей WAL между
начальным_lsn
иконечным_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
, будут гарантированно иметь уникальную комбинациюначального_lsn
иid_блока
.Большая часть показанной здесь информации совпадает с выводом функции
pg_get_wal_records_info
, при условии передачи одинаковых аргументов. Однакоpg_get_wal_block_info
выводит информацию из каждой записи WAL в расширенном виде, добавляя в вывод по одной строке для каждой ссылки на блок, поэтому некоторые детали отслеживаются на уровне ссылки на блок, а не на уровне целой записи. Такая структура полезна при работе с запросами, которые отслеживают изменение отдельных блоков с течением времени. Обратите внимание, что для записей без ссылок на блоки (например, записи WAL дляCOMMIT
), строки возвращаться не будут, поэтому функция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.101) позволяет определить, какое отношение было изменено первоначально.Клиенты могут избежать издержек материализации данных блока, что может существенно ускорить выполнение функции. Когда для
show_data
задано значениеfalse
, значенияblock_data
иblock_fpi_data
опускаются (то есть выходные аргументыblock_data
иblock_fpi_data
принимают значениеNULL
для всех возвращаемых строк). Очевидно, что подобная оптимизация осуществима только для запросов, которым на самом деле не требуются данные блоков.Функция выдаёт ошибку, если
начальный_lsn
недоступен.-
pg_get_wal_stats(start_lsn pg_lsn, end_lsn pg_lsn, per_record boolean DEFAULT false) returns setof record
# Выдаёт статистику по всем корректным записям WAL между
начальным_lsn
иконечным_lsn
. По умолчанию возвращает одну строку для каждого типаменеджера_ресурсов
(resource_manager). Когдапо_типу_записи
имеет значение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
Функция выдаёт ошибку, если
начальный_lsn
недоступен.
F.64.2. Автор #
Бхарат Рупиредди (Bharath Rupireddy) <bharath.rupireddyforpostgres@gmail.com>