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

Онлайн-осмотр WAL с pg_walinspect

OrioleDB записывает изменения на уровне строк в журнал предзаписи PostgreSQL (WAL) через собственный диспетчер ресурсов (ID 129, имя OrioleDB resource manager). Каждая запись WAL PostgreSQL от данного диспетчера имеет тип записи OrioleDB WAL container и содержит сериализованный поток подзаписей, специфичных для OrioleDB, таких как INSERT, UPDATE, DELETE, COMMIT и TRUNCATE.

Расширение pg_walinspect позволяет декодировать полезную нагрузку в описания, читаемые человеком, на запущенном сервере.

Логика декодирования (orioledb_rm_desc) регистрируется в PostgreSQL при загрузке расширения orioledb и используется как pg_walinspect, так и orioledb_waldump.

Стандартная утилита pg_waldump показывает только общие записи custom129 и не декодирует детали полезной нагрузки OrioleDB.

Предварительные требования​

  1. Добавить orioledb в shared_preload_libraries в postgresql.conf и перезапустить сервер.
  2. Создать расширения в базе данных:
CREATE EXTENSION orioledb;
CREATE EXTENSION pg_walinspect;

Функции pg_walinspect требуют прав суперпользователя или членства в роли pg_read_server_files (так же, как в исходном PostgreSQL).

Использование​

Пример регистрации диапазона LSN вокруг рабочей нагрузки, подлежащей осмотру, затем запрос pg_get_wal_records_info:

  1. Отметьте начало диапазона:

    SELECT pg_current_wal_insert_lsn() AS start_lsn \gset
  2. Выполните операторы DML над таблицами OrioleDB:

    INSERT INTO my_table VALUES (1, 'hello');
    UPDATE my_table SET val = 'world' WHERE id = 1;
  3. Отметьте конец диапазона и принудительно сбросьте WAL:

    SELECT pg_switch_wal();
    SELECT pg_current_wal_insert_lsn() AS end_lsn \gset
  4. Декодируйте записи OrioleDB в указанном диапазоне:

    SELECT start_lsn, end_lsn, xid, record_type, description
    FROM pg_get_wal_records_info(:'start_lsn', :'end_lsn')
    WHERE resource_manager = 'OrioleDB resource manager';

Осмотр отдельной записи также возможен с помощью pg_get_wal_record_info(in_lsn).

Столбец description содержит декодированные подзаписи OrioleDB, добавленные после имени типа контейнера. Например, контейнер, записавший вставку и фиксацию, может выглядеть так:

INSERT ([ 16384 16389 16390 ]); COMMIT (12345 100 100 - xmin 12340 csn 67890);

OID кортежей в скобках представлены как [ datoid reloid relnode ] — OID базы данных, OID отношения и filenode затрагиваемой таблицы.

В качестве end_lsn можно использовать FFFFFFFF/FFFFFFFF для чтения до текущей позиции вставки WAL сервера.

Типы подзаписей WAL OrioleDB​

Каждый контейнер WAL OrioleDB содержит одну или более подзаписей. Декодер выводит имя типа и специфичные для типа метаданные:

ТипЗначение
XIDНачало транзакции: oxid OrioleDB, логический xid, xid кучи
COMMIT / ROLLBACKЗавершение транзакции с xmin и CSN
RELATIONМетаданные отношения для дерева: OID и тип дерева
INSERT / UPDATE / DELETE / REINSERTМодификация строки в [ datoid reloid relnode ]
TRUNCATEУсечение в [ datoid reloid relnode ]
SAVEPOINT / RB_TO_SPКонтрольная точка подтранзакции и откат к контрольной точке
JOINT_COMMITКоординированная фиксация между кучей и OrioleDB
SWITCH_LOGICAL_XIDСопоставляет верхнеуровневый xid кучи с под-xid OrioleDB
RELREPLIDENTИзменение идентификации реплики
META_LOCK / META_UNLOCKБлокировка/разблокировка метаданных каталога
BRIDGE_ERASEСтертие моста для кортежей между движками
REPLAY_FEEDBACKОбратная связь логической репликации

REINSERT используется внутренне, когда обновление первичного ключа представлено как удаление плюс вставка; логическое декодирование может по-прежнему отображать его как UPDATE.

Когда использовать​

Использовать pg_walinspect, когда сервер запущен и требуется соотнести записи WAL с SQL-запросами, фильтровать по LSN в скриптах или интегрировать осмотр в системы мониторинга.