Перейти к основному содержимому

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_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

: Получает статистику всех действительных записей журнала упреждающей записи между 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 недоступен.