F.49. pg_walinspect — низкоуровневая проверка WAL#

F.49. pg_walinspect — низкоуровневая проверка WAL

F.49. pg_walinspect — низкоуровневая проверка WAL #

Модуль pg_walinspect предоставляет SQL-функции, которые позволяют вам осмотреть содержимое журнала предварительной записи (write-ahead log) работающего кластера баз данных Tantor BE на низком уровне, что полезно для отладки, аналитических, отчетных или образовательных целей. Он похож на pg_waldump, но доступен через SQL, а не отдельную утилиту.

Все функции этого модуля будут предоставлять информацию WAL, используя текущий идентификатор временной шкалы сервера.

Примечание

Функции pg_walinspect часто вызываются с аргументом LSN, который указывает местоположение, где начинается известная запись WAL начинается. Однако некоторые функции, такие как 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.

F.49.1. Общие функции #

pg_get_wal_record_info(in_lsn pg_lsn) returns record #

Получает информацию о записи WAL о записи, которая находится на или после аргумента 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 не находится в начале записи WAL, будет показана информация о следующей допустимой записи WAL. Если следующей допустимой записи WAL нет, функция вызовет ошибку.

pg_get_wal_records_info(start_lsn pg_lsn, end_lsn pg_lsn) returns setof record #

Получает информацию обо всех допустимых записях WAL между start_lsn и end_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        |

Функция вызывает ошибку, если start_lsn недоступен.

pg_get_wal_block_info(start_lsn pg_lsn, end_lsn pg_lsn, show_data boolean DEFAULT true) returns setof record #

Получает информацию о каждой ссылке на блок из всех допустимых WAL-записей между start_lsn и end_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, гарантированно имеют уникальную комбинацию значений start_lsn и block_id.

Многое из представленной здесь информации совпадает с выводом, который pg_get_wal_records_info показал бы при тех же аргументах. Однако, pg_get_wal_block_info разворачивает информацию из каждой записи WAL в расширенную форму, выводя одну строку на каждую ссылку на блок, поэтому определенные детали отслеживаются на уровне ссылок на блоки, а не на уровне всей записи. Эта структура полезна для запросов, которые отслеживают, как отдельные блоки изменялись со временем. Обратите внимание, что записи без ссылок на блоки (например, COMMIT записи WAL) не будут возвращать строки, поэтому 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.97) может помочь вам определить, какое отношение было изменено во время первоначального выполнения.

Клиенты могут избежать накладных расходов на материализацию данных блоков. Это может значительно ускорить выполнение функции. Когда 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 #

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

F.49.2. Автор #

Bharath Rupireddy