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
недоступен.