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

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

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

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

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

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

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

orioledb_waldump компилируется и устанавливается вместе с расширением OrioleDB (в BINDIR PostgreSQL, рядом с pg_waldump). Утилита читает файлы сегментов WAL напрямую из pg_wal и не требует запущенного сервера или загруженного расширения.

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

orioledb_waldump -p $PGDATA/pg_wal -s START_LSN -e END_LSN

Также можно передать имена файлов сегментов WAL вместо границ LSN:

orioledb_waldump -p $PGDATA/pg_wal 000000010000000000000001
orioledb_waldump -p $PGDATA/pg_wal 000000010000000000000001 000000010000000000000002

Опции​

ОпцияОписание
-p, --path=PATHКаталог, содержащий файлы сегментов WAL (по умолчанию pg_wal в PGDATA при автоматическом определении)
-s, --start=RECPTRНачать чтение с позиции WAL RECPTR (формат X/YYYYYYYY)
-e, --end=RECPTRОстановить чтение на позиции WAL RECPTR
-t, --timeline=TLIТаймлайн для чтения (по умолчанию: 1)
-x, --xid=XIDПоказать только записи с указанным ID транзакции PostgreSQL
-n, --limit=NОстановиться после отображения N записей
-f, --followПродолжать попытки после достижения конца WAL (полезно при работающем сервере)
--all-rmgrsВывести однострочные резюме и для записей, не относящихся к OrioleDB
-q, --quietПодавить вывод (за исключением ошибок)

Пример вывода​

Каждая запись OrioleDB выводится на отдельной строке:

rmgr: OrioleDB resource manager len (rec/tot): 128/ 128, tx: 742, lsn: 0/01A2B3C4, prev 0/01A2B000, desc: OrioleDB WAL container INSERT ([ 16384 16389 16390 ]);

Поля соответствуют соглашениям pg_waldump: длина записи, ID транзакции, LSN, предыдущий LSN, тип записи и декодированный поток подзаписей OrioleDB.

Типы подзаписей 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.

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

Использовать orioledb_waldump при анализе WAL остановленного сервера, каталога pg_wal физической резервной копии или архива WAL реплики — в ситуациях, когда расширение orioledb не может быть загружено.

Использовать pg_waldump --rmgr=custom129 только при необходимости получения метаданных уровня PostgreSQL (заголовки записей, FPI) без декодирования полезной нагрузки OrioleDB.