PostgreSQL逻辑复制中表重命名与新增发布表的无数据丢失方案咨询
逻辑复制下表重命名与新增发布表的无数据丢失方案
问题根源
你之前的操作导致数据丢失,核心原因有两点:
- 禁用订阅期间,主库产生的变更会暂存在复制槽,但订阅恢复后,由于主库表名已变更,订阅端原表名与发布端新表名不匹配,这些变更无法被正常应用;
- 使用
copy_data=false刷新订阅时,既不会同步暂停期间的增量数据,也不会初始化新增表的现有数据,直接导致数据断层。
无数据丢失的无缝操作步骤
针对AWS RDS PostgreSQL 14环境,结合你迁移父子表到分区表的需求,可按以下流程操作:
1. 将新增表加入主库发布
无需暂停订阅,直接在主库执行:
ALTER PUBLICATION my_publication ADD TABLE 新增表1, 新增表2;
2. 无缝处理表重命名
逻辑复制中表名变更需要同步修改订阅端的表映射,避免后续变更无法匹配:
- 在主库重命名目标表:
ALTER TABLE 原表名 RENAME TO 新表名; - 在SOR库修改订阅的表映射关系,让订阅端识别新表名:
ALTER SUBSCRIPTION my_subscription SET TABLE MAP (原表名 = 新表名); - 在SOR库重命名本地接收表:
ALTER TABLE 原表名 RENAME TO 新表名;
3. 刷新订阅同步新增表
执行刷新订阅命令,使用默认的copy_data=true(PostgreSQL 14中该参数默认值为true):
ALTER SUBSCRIPTION my_subscription REFRESH PUBLICATION;
该操作会自动完成新增表的现有数据初始化,同时同步所有变更(全程未暂停订阅,不会出现数据堆积丢失的问题)。
关于copy_data=true的作用
copy_data=true主要用于刷新订阅时,将新增到发布中的表的现有数据从主库复制到订阅端,这是新增表初始化的必要操作。但对于已在订阅中的重命名表,该参数不会产生影响,核心还是依赖表映射的修改来保证变更同步。
分区表迁移场景额外注意
如果是将原非分区表迁移为分区表,需确保:
- 主库的分区表已正确配置分区规则;
- 将分区表(而非单个分区)加入发布(PostgreSQL 14支持对分区表整体发布,无需逐个添加分区);
- 数据迁移完成后再执行表名切换和订阅映射修改,避免迁移过程中的数据同步异常。
内容的提问来源于stack exchange,提问作者hxcb
相关产品推荐
相关产品推荐

