Офлайн-осмотр 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.