未配置本地MSSQL CDC前置时AWS DMS CDC同步问题咨询
AWS DMS对接SQL Server 2012标准版CDC同步问题解答
问题背景
当前采用AWS DMS仅CDC迁移模式,同步数据库时间点恢复后到当前状态的变更,从批量加载启动时点开始复制变更,实现源端与目标端持续同步。本次配置源端为本地SQL Server 2012标准版,目标端为AWS RDS MSSQL 2019标准版。参照官方文档尝试在源库执行以下命令开启库级CDC时遇到报错:
use uat_testdb EXEC sys.sp_cdc_enable_db
报错信息:Msg 22988, Level 16, State 1, Procedure sp_cdc_enable_db, Line 14,提示当前64位标准版SQL Server的CDC功能仅支持企业版、开发者版、企业评估版,核实后确认SQL Server标准版从2016 SP1及后续版本才原生支持CDC能力。
1. 不升级本地SQL Server 2012标准版的完整CDC同步替代方案
不需要升级版本也能实现全量变更同步,可选方案按落地成本从低到高排序:
- 直接调整AWS DMS捕获模式为事务日志备份解析模式:这个模式不依赖SQL Server自带的原生CDC功能,只需要给DMS使用的源库账号授予足够权限,配置DMS读取源库定期生成的事务日志备份(支持读取本地共享目录或同步到S3的备份文件),DMS会直接解析事务日志的原始内容捕获所有增、删、改操作,完全兼容SQL Server 2012标准版,是成本最低的方案。
- 用触发器做变更捕获:给需要同步的所有表新增插入、更新、删除三类触发器,变更发生时把完整的行数据、操作类型写入自定义的变更记录中间表,DMS配置为轮询中间表的模式同步数据,缺点是会给源库带来额外写入开销,表多、写入量大的场景不推荐。
- 第三方日志解析工具中转:比如用Debezium连接器直接解析源库事务日志,把变更投递到消息队列后再同步到目标RDS,链路更长,运维成本更高,适合已经有相关技术栈的团队。
2. CDC前置配置的强制要求判定
SQL Server原生CDC前置配置不是DMS CDC任务的全局强制要求,仅在使用「依赖原生CDC的捕获模式」时才必须配置。
当前遇到的仅能同步插入、删除,无法同步更新的问题,本质是DMS自动降级了捕获模式:当DMS检测到源库是2012标准版、无法开启原生CDC时,会自动切到最基础的事务日志直读模式,这个模式不需要原生CDC支持,但只能解析日志里存储了完整行数据的插入、删除操作;更新操作的事务日志默认只记录变更字段和行定位标识,没有原生CDC提供的完整行版本、表结构映射元数据的话,DMS无法拼出更新后的完整行内容,自然没法同步更新操作。
要解决这个问题,要么切到前面提到的事务日志备份解析模式,要么升级源库版本启用原生CDC。
3. 未配置CDC时DMS无告警且能同步部分操作的原因
这是DMS针对SQL Server源设计的自动降级兼容逻辑导致的:
- DMS启动CDC任务时,会先检测源库是否开启原生CDC,如果检测不通过,不会直接抛出错误终止任务,而是静默回退到基础事务日志直读模式,这个模式切换的记录只会写在任务的底层debug日志里,控制台概览页的告警、统计模块不会主动提示,大部分用户不会特意翻查底层日志就感知不到模式变化。
- 基础事务日志直读模式本身可以正常解析插入、删除操作的日志记录——这两类操作的日志条目里自带完整的行数据,不需要额外元数据就能解析同步,所以控制台会显示持续有变更流量同步,任务状态显示为正常运行,只有实际测试更新操作时才会暴露能力缺陷。
内容的提问来源于stack exchange,提问作者Karikalan
相关产品推荐
相关产品推荐

