DBAtlas · Атлас эксплуатации баз данных

Разрешить конфликт логической репликации (disable_on_error, SKIP)

PostgreSQLЛогическая репликация

Команда

-- 1) Prevent a failing apply worker from looping forever:
ALTER SUBSCRIPTION sub_app SET (disable_on_error = true);
-- 2) Find the finish LSN of the conflicting transaction in the subscriber log:
--    CONTEXT: ... in transaction 749, finished at 0/5035378
-- 3a) Preferred: fix/delete the conflicting row on the subscriber, then re-enable:
ALTER SUBSCRIPTION sub_app ENABLE;
-- 3b) Or skip the whole remote transaction (NONE of its changes are applied on the subscriber):
ALTER SUBSCRIPTION sub_app SKIP (lsn = '0/5035378');
ALTER SUBSCRIPTION sub_app ENABLE;
SELECT subname, subenabled, subskiplsn FROM pg_subscription;

Что делает

Когда ошибка, например duplicate key, отсутствующая строка или проблема с правами, останавливает apply на подписчике: disable_on_error автоматически отключает подписку; либо исправьте конфликтующие данные и выполните ENABLE, либо пропустите через SKIP всю удалённую транзакцию, определённую по LSN 'finished at' в журнале.

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

Когда рабочий процесс apply падает и постоянно перезапускается из-за прямой записи на подписчике, неполного начального копирования или двунаправленной записи.

Внимание

SKIP также отбрасывает неконфликтующие изменения этой транзакции, и стороны расходятся навсегда; предпочтительнее исправить данные, а после SKIP сравните таблицу. Пока конфликт не разрешён, слот на издателе продолжает накапливать WAL. Запретите запись приложения в таблицы подписчика с помощью привилегий.

Открыть в DBAtlas →

Связанные материалы