2024年9月26日:PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不支持的版本:11 / 10

29.6. 冲突 #

逻辑复制的行为类似于正常的 DML 操作,即使数据在订阅节点上本地更改,数据也会被更新。如果传入数据违反任何约束,则复制将停止。这被称为冲突。复制UPDATEDELETE操作时,缺失的数据不会产生冲突,此类操作将简单地跳过。

逻辑复制操作以拥有订阅的角色的权限执行。目标表上的权限失败将导致复制冲突,启用目标表上的行级安全(订阅者所属)也会导致冲突,无论任何策略是否通常会拒绝正在复制的INSERTUPDATEDELETETRUNCATE。此行级安全限制可能会在将来的PostgreSQL版本中解除。

冲突将产生错误并停止复制;必须由用户手动解决。有关冲突的详细信息可以在订阅服务器日志中找到。

可以通过更改订阅者上的数据或权限来解决冲突,使其不与传入更改冲突,或者跳过与现有数据冲突的事务。当冲突产生错误时,复制将不会继续,逻辑复制工作程序将向订阅服务器日志发出以下类型的消息

ERROR:  duplicate key value violates unique constraint "test_pkey"
DETAIL:  Key (c)=(1) already exists.
CONTEXT:  processing remote data for replication origin "pg_16395" during "INSERT" for replication target relation "public.test" in transaction 725 finished at 0/14C0378

包含违反约束条件的更改的事务的 LSN 和复制源名称可以在服务器日志中找到(上述情况中的 LSN 0/14C0378 和复制源pg_16395)。可以使用ALTER SUBSCRIPTION ... SKIP和结束 LSN(即 LSN 0/14C0378)跳过产生冲突的事务。结束 LSN 可以是事务在发布者上提交或准备时的 LSN。或者,也可以通过调用pg_replication_origin_advance()函数跳过事务。在使用此函数之前,需要通过ALTER SUBSCRIPTION ... DISABLE临时禁用订阅,或者可以使用disable_on_error选项使用订阅。然后,可以使用pg_replication_origin_advance()函数以及node_name(即pg_16395)和结束 LSN 的下一个 LSN(即 0/14C0379)。可以在pg_replication_origin_status系统视图中查看源的当前位置。请注意,跳过整个事务包括跳过可能不会违反任何约束的更改。这很容易使订阅者不一致。

streaming模式为parallel时,可能不会记录失败事务的结束 LSN。在这种情况下,可能需要将流模式更改为onoff并再次导致相同的冲突,以便将失败事务的结束 LSN 写入服务器日志。有关结束 LSN 的用法,请参阅ALTER SUBSCRIPTION ... SKIP

提交更正

如果您在文档中看到任何不正确的内容,与您对特定功能的体验不符,或者需要进一步说明,请使用此表单报告文档问题。