AWS蓝绿部署升级RDS后,如何恢复DMS任务断点续传?
问题分析与解决方案
一、先排查pg_hba.conf连接报错(启动DMS的前提)
尽管你认为该报错有误导性,但它是DMS任务启动的直接阻碍,需先完成以下检查:
- 验证新RDS实例的安全组规则:确保DMS复制实例所属的安全组/IP段(
10.*.0.*)被允许访问RDS的5432端口 - 检查新RDS的参数组配置:确认
rds.logical_replication已设置为1(逻辑复制的强制要求) - 确认RDS的连接权限配置:
- 确保
pg_hba.conf(RDS中通过参数组或控制台“连接权限”管理)允许用户x从DMS的VPC CIDR访问数据库x - PostgreSQL 16对SSL连接的要求更严格:检查参数
ssl是否设为on,同时DMS源端点需开启SSL连接(若RDS强制SSL)
- 确保
二、实现DMS断点续传的核心操作
要让DMS从旧任务的断点继续同步,关键是让新复制槽承接旧槽的LSN(日志序列号)位置,而非仅创建同名同类型的空槽:
- 提前记录旧复制槽的LSN位置
在升级前的旧RDS实例上,执行SQL获取旧复制槽的断点LSN:
SELECT slot_name, confirmed_flush_lsn FROM pg_replication_slots WHERE slot_name = '你的复制槽名称';
记录返回的confirmed_flush_lsn值(例如0/1A2B3C4D)
- 在新RDS实例上创建带LSN的复制槽
不要直接创建空复制槽,而是用指定LSN的方式创建,确保新槽从断点开始捕获变更:
SELECT pg_create_logical_replication_slot('你的复制槽名称', 'pgoutput', '记录的LSN值');
示例:
SELECT pg_create_logical_replication_slot('dms_sync_slot', 'pgoutput', '0/1A2B3C4D');
- 配置并重启DMS任务
- 确认DMS源端点已切换为新的RDS实例
- 检查任务的CDC起始位置设置:确保未强制指定起始时间或LSN,让任务依赖复制槽的位置
- 重启任务时选择Resume task,而非从头启动全量同步
- 验证同步状态
启动任务后,通过以下方式确认断点续传生效:
- 查看DMS任务日志,确认无连接或复制槽错误
- 对比Redshift与新RDS的数据一致性,检查新增/修改的数据是否同步
- 在新RDS上执行
SELECT slot_name, confirmed_flush_lsn FROM pg_replication_slots;,确认confirmed_flush_lsn持续增长,说明复制槽正常捕获变更
三、额外注意事项
- 确保DMS复制实例的引擎版本支持PostgreSQL 16,建议使用最新版DMS引擎以兼容新版本特性
- 新RDS实例的
wal_level必须为logical(RDS中设置rds.logical_replication=1会自动配置该参数) - 如果旧复制槽的LSN已被新实例的WAL日志清理(例如升级过程中WAL被自动回收),则无法实现断点续传,需重新执行全量同步
内容的提问来源于stack exchange,提问作者Jayadevan
相关产品推荐
相关产品推荐

