F.53. 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.53.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.53.2. Автор #
Бхарат Рупиредди (Bharath Rupireddy) <bharath.rupireddyforpostgres@gmail.com>