咨询Logical replication行为:源更新column1却覆盖目标column2是否正常
PostgreSQL逻辑复制:源端单字段更新覆盖目标端自定义字段的行为解析
这属于逻辑复制的正常默认行为,核心原因和它的同步机制直接相关:
- 默认采用全行复制模式:源端执行UPDATE操作时,哪怕只修改了单个字段,默认的publication会将整行数据同步到目标端。目标端接收到数据后,会用源端的整行覆盖主键/唯一键匹配的本地行——不管目标端该字段之前有没有被手动修改过。
- 这种设计的初衷是确保源端作为数据权威,两端数据严格一致,默认不允许目标端的本地修改脱离源端的同步规则。
如果要避免目标端自定义字段被覆盖,可以通过两种方式调整:
配置部分字段复制
创建publication时仅指定需要同步的字段,这样源端更新指定字段时,目标端只会同步该字段,其他字段不受影响。示例SQL:CREATE PUBLICATION pub_t1 FOR TABLE t1 (column1);设置冲突解决策略
在订阅端配置冲突处理规则,比如保留目标端的修改。PostgreSQL 10+支持在创建订阅时指定ON_CONFLICT子句,示例:CREATE SUBSCRIPTION sub_t1 CONNECTION 'dbname=target_db host=source_host' PUBLICATION pub_t1 WITH (ON_CONFLICT_DO_NOTHING); -- 或根据业务需求使用ON_CONFLICT_DO_UPDATE并指定同步字段
内容的提问来源于stack exchange,提问作者satya k
相关产品推荐
相关产品推荐

