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;

概要

重複キー、行の欠落、権限の問題などのエラーでサブスクライバのapplyが停止した場合: disable_on_errorはサブスクリプションを自動的に無効化する。競合するデータを修正してENABLEするか、ログの'finished at' LSNで特定されるリモートトランザクション全体をSKIPする。

使用する場面

サブスクライバへの直接書き込み、不完全な初期コピー、双方向の書き込みが原因で、applyワーカーが失敗し再起動を繰り返すときに。

注意

SKIPはそのトランザクション内の競合していない変更も破棄し、両側は恒久的に乖離する。データの修正を優先し、SKIP後は表を比較する。競合が解決されるまで、パブリッシャ上のスロットはWALを蓄積し続ける。権限によりサブスクライバの表へのアプリケーションの書き込みを防ぐ。

DBAtlas で開く →

関連項目