30.3. コンフリクト

サブスクライバーノードでローカルにデータが変更された場合でも、データが更新されるという点では、論理レプリケーションは通常のDML操作と同じように振る舞います。 到着したデータが制約に違反すると、レプリケーションは停止します。 これは、コンフリクトと呼ばれます。 UPDATEあるいはDELETE操作をレプリケーションする場合は、存在しないデータによってコンフリクトは起こらず、そのような操作は単にスキップされます。

コンフリクトはエラーを生じさせ、レプリケーションを停止させます。 コンフリクトはユーザが手動で解消しなければなりません。 コンフリクトの詳細は、サブスクライバーのサーバーログに出力されます。

コンフリクトの解消は、到着した更新とコンフリクトしないようにサブスクライバーのデータを変更するか、既存のデータとコンフリクトしているトランザクションをスキップさせることで達成できます。 トランザクションは、pg_replication_origin_advance()関数にサブスクリプション名に関連するnode_nameと位置を引数で渡すことによりスキップできます。 オリジンの現在位置はpg_replication_origin_statusシステムビューで参照できます。