Онлайн-осмотр 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.
Предварительные требования
- Добавить
orioledbвshared_preload_librariesвpostgresql.confи перезапустить сервер. - Создать расширения в базе данных:
CREATE EXTENSION orioledb;
CREATE EXTENSION pg_walinspect;
Функции pg_walinspect требуют прав суперпользователя или членства в роли pg_read_server_files (так же, как в исходном PostgreSQL).
Использование
Пример регистрации диапазона LSN вокруг рабочей нагрузки, подлежащей осмотру, затем запрос pg_get_wal_records_info:
-
Отметьте начало диапазона:
SELECT pg_current_wal_insert_lsn() AS start_lsn \gset -
Выполните операторы DML над таблицами OrioleDB:
INSERT INTO my_table VALUES (1, 'hello');UPDATE my_table SET val = 'world' WHERE id = 1; -
Отметьте конец диапазона и принудительно сбросьте WAL:
SELECT pg_switch_wal();SELECT pg_current_wal_insert_lsn() AS end_lsn \gset -
Декодируйте записи OrioleDB в указанном диапазоне:
SELECT start_lsn, end_lsn, xid, record_type, descriptionFROM 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 в скриптах или интегрировать осмотр в системы мониторинга.