迁移作为主键的LOB列:AWS DMS CDC阶段报错的解决咨询
解决CDC阶段LOB主键重复冲突问题的方案
针对你遇到的RDS PostgreSQL到Aurora PostgreSQL迁移时,CDC阶段因LOB类型主键分两步写入导致的主键重复报错,可尝试以下几种解决方案:
1. 配置CDC阶段的LOB内联传输参数
AWS DMS的InlineLobMaxSize仅控制全量加载阶段的LOB内联,而CDC阶段需要单独配置cdc.lob.inline.max.size参数,将其设置为与全量阶段相同的数值(确保能覆盖主键text列的实际长度)。这样CDC阶段会直接将LOB类型的主键值内联到变更记录中,一步完成写入,避免先插入null值再更新LOB的两步操作,从根源上消除主键冲突。
操作步骤:
- 暂停当前的DMS迁移任务
- 在任务的CDC设置中找到
cdc.lob.inline.max.size参数,设置为合适的大小(例如全量阶段用的10240即10KB) - 重启迁移任务,验证CDC阶段是否正常执行
2. 临时禁用目标表的主键约束
如果无法通过参数配置解决,可以在全量加载完成后,临时禁用目标Aurora表的主键约束,待CDC追上源库数据后再重新启用约束:
操作步骤:
- 全量加载完成后,暂停DMS任务
- 登录目标Aurora PostgreSQL集群,执行SQL禁用主键约束:
ALTER TABLE xxx DISABLE CONSTRAINT xxx_pkey; - 重启DMS任务,等待CDC同步完成(可通过DMS控制台查看任务进度,确认已追上源库最新数据)
- 再次暂停任务,执行SQL启用主键约束:
ALTER TABLE xxx ENABLE CONSTRAINT xxx_pkey; - 启用约束前建议先检查数据一致性,避免存在实际的主键重复数据:
SELECT xxx_id, COUNT(*) FROM xxx GROUP BY xxx_id HAVING COUNT(*) > 1;
注意:此方法仅适用于目标集群在迁移期间无其他写入操作的场景,否则可能引入脏数据。
3. 调整主键字段类型(若业务允许)
如果业务场景允许,可将源表和目标表中的text类型主键改为varchar(n)类型(n设置为能覆盖实际数据长度的最大值)。因为varchar类型不会被DMS识别为LOB,全量和CDC阶段都会按普通字段处理,自然不会出现两步写入的问题。
操作步骤:
- 在源库和目标库分别修改表结构:
ALTER TABLE xxx ALTER COLUMN xxx_id TYPE varchar(255); - 重新配置DMS迁移任务,确保字段映射正确
- 重新执行全量+CDC迁移
注意:修改字段类型需要业务配合,确保没有超出长度的现有数据,且应用程序兼容新的字段类型。
内容的提问来源于stack exchange,提问作者AFortunato
相关产品推荐
相关产品推荐

