数据库同步模式选型:全量增量与CDC拆分策略
云上云下数据库同步、RDS到自建库同步、业务库到报表库同步——这类任务上线前,团队常常会被一个问题带偏:是不是得搞实时?
实时性当然重要,但它远不是唯一判断标准。目标表有没有历史数据?源表有没有可靠的增量字段?删除事件要不要传递过去?源库的日志和账号权限能不能满足要求?任务失败后,怎么证明目标端没少数据?这些问题如果没提前拆清楚,后面排障会非常被动。
全量、增量字段和CDC这三者,不是简单的“低配、中配、高配”关系。全量负责给目标端建立数据基线,增量字段按稳定字段持续推进,CDC则负责捕获完整的变更事件。下面以DataMover的任务配置实践为例,把整个选择过程整理成一份上线前检查清单——希望能帮你少踩几个坑。
先从业务场景反推同步模式
同步模式怎么选?别先看工具支持什么功能,先看业务约束是什么。
| 场景 | 更适合的模式 | 判断依据 |
|---|---|---|
| 新目标库初始化 | 全量同步 | 目标端需要一份完整历史数据 |
| 历史补数 | 全量同步 | 要补齐某个时间段或某批历史记录 |
| 报表库低频刷新 | 全量或定期覆盖 | 小时级、天级延迟可以接受 |
| 源表持续追加 | 增量字段同步 | 有自增ID、入库时间或稳定更新时间 |
| 旧数据更新也要同步 | 增量字段或CDC | 取决于更新时间字段是否一定变化 |
| 物理删除必须同步 | CDC | 字段增量无法自然捕获物理删除 |
| 秒级延迟或事件级同步 | CDC | 需要读取数据库变更日志 |
说白了:如果目标库还没有基线,第一步通常不是直接上CDC,而是先把历史数据同步过去。如果只是每天同步一次统计表,CDC也可能是过度设计。真正要做的是把完整性、延迟、权限和排障成本放到一张表里综合判断。
全量同步:重点在目标表策略
全量同步适合新库初始化、一次性迁移、历史补数和低频刷新。它的语义最简单:从源表读取完整数据,再写入目标端。
但全量同步上线前不能只看“能不能跑完”,更要看目标端策略。
| 检查项 | 风险 | 建议处理 |
|---|---|---|
| 目标表是否为空 | 已有数据可能被覆盖、重复或污染 | 明确清空、追加、写新表还是写临时表 |
| 是否需要备份 | 出错后难以回退 | 生产目标表先备份或保留快照 |
| 批大小 | 批量过大可能造成内存和写入压力 | 先用保守批大小试跑,再按监控调整 |
| 分片字段 | 大表单线程读取耗时较长 | 有稳定主键或范围字段时再考虑分片 |
| 目标端索引 | 写入可能被索引拖慢 | 大批量写入时评估先写数据再补索引 |
| 字段类型 | 精度丢失、字段截断、默认值不一致 | 提前核对类型、长度、主键和默认值 |
在DataMover中,普通任务可以用于全量同步。实践中更稳妥的做法是:先用小表跑通源端读取、目标端写入、字段映射和执行记录,再扩大到核心表。页面显示“完成”只能说明任务流程结束了,不能替代目标端校验——这个区别很关键。
增量字段:字段稳定性决定能不能用
增量字段同步看起来轻量,但它对字段质量要求很高。常见字段包括自增ID、update_time、入库时间、业务流水号。
上线前建议按下面这张表检查:
| 检查项 | 可以接受 | 高风险表现 |
|---|---|---|
| 字段推进方式 | 自增、时间递增、业务流水递增 | 字段会倒退、会被手工修正 |
| 旧数据更新 | 更新时一定修改 update_time | 更新旧数据但时间字段不变 |
| 历史回填 | 回填数据仍能落在新范围内 | 回填到旧时间段,任务不会再扫描 |
| 删除语义 | 软删除字段能表达删除状态 | 物理删除必须传递到目标端 |
| 延迟要求 | 分钟级或定时同步可接受 | 要求秒级响应 |
增量字段同步不是CDC的替代品。它适合“可以按字段继续往后追”的表,不适合“必须捕获所有INSERT、UPDATE、DELETE事件”的表。
DataMover的字段映射环节,要重点看主键、时间字段、金额字段、字符字段长度和字符集。异构数据库之间同步时,字段名能对应上不代表语义完全一致——datetime、timestamp、decimal、varchar这些细节都要提前确认。
CDC:不要跳过日志、权限和位点检查
CDC适合实时数仓、业务库到分析库、下游系统接收变更、迁移过程中的持续同步。它能捕获插入、更新和删除,但前置条件比全量和增量字段多得多。
| 检查项 | 为什么重要 |
|---|---|
| 源库日志能力 | MySQL binlog、PostgreSQL WAL、SQL Server/Oracle/达梦对应日志能力需要满足要求 |
| 账号权限 | 需要读取日志、表结构和元数据 |
| 初始快照 | 决定目标端如何建立第一份基线 |
| 位点保存 | 影响任务重启后从哪里继续消费 |
| 位点重置 | 操作不当可能带来重复或漏数 |
| DDL变更 | 加字段、改类型后目标端映射需要处理 |
| 大事务 | 可能造成延迟抖动和目标端批量写入压力 |
如果使用DataMover配置CDC,需要区分普通任务和实时任务。普通任务更适合全量和增量字段同步,实时任务才用于CDC。上线单中要写清楚:是否执行初始快照?目标表是否已有数据?位点策略是什么?DDL变更由谁处理?
实施过程可以拆成九步
一条同步链路从测试到上线,可以按下面的顺序拆:
- 确认源库和目标库网络连通性。
- 确认源端账号读取权限、目标端账号写入权限。
- 建立源端和目标端数据源。
- 选择任务类型:全量、增量字段或CDC。
- 选择源表和目标表,明确是否自动建表。
- 检查字段映射,重点看主键、时间字段、金额字段、字符字段长度。
- 小表试跑,观察输入、输出、失败数和错误数据。
- 执行SQL校验,不只看任务完成状态。
- 上线后持续观察延迟、失败记录和目标端业务指标。
DataMover的执行监控里要同时看输入量、输出量、失败数、错误数据和日志。同步进度不能单独证明目标端完整一致——目标端约束拦截、字段截断、时间偏移、脏数据写入失败,都可能导致“任务完成但数据少了”。
目标端校验SQL
上线前不要只做行数校验。至少要覆盖行数、时间范围、关键字段聚合和主键抽样。
-- 行数校验
SELECT COUNT(*) FROM source_table;
SELECT COUNT(*) FROM target_table;
-- 时间范围校验
SELECT MIN(update_time), MAX(update_time) FROM source_table;
SELECT MIN(update_time), MAX(update_time) FROM target_table;
-- 关键字段聚合校验
SELECT status, COUNT(*) FROM source_table GROUP BY status ORDER BY status;
SELECT status, COUNT(*) FROM target_table GROUP BY status ORDER BY status;
-- 主键抽样校验
SELECT * FROM source_table WHERE id IN (1, 100, 1000);
SELECT * FROM target_table WHERE id IN (1, 100, 1000);
订单、金额、库存类表还要补业务聚合:
SELECT status, COUNT(*) AS cnt, SUM(amount) AS total_amount
FROM source_table
GROUP BY status
ORDER BY status;
SELECT status, COUNT(*) AS cnt, SUM(amount) AS total_amount
FROM target_table
GROUP BY status
ORDER BY status;
这类校验不能证明所有数据百分百一致,但可以快速发现少行、时间范围缺口、状态分布异常和金额聚合不一致——性价比很高。
几个常见问题
目标表状态没确认
目标表为空和目标表已有数据,是两种完全不同的上线策略。前者通常先建立基线,后者要明确覆盖、追加、写新表还是从当前位点继续。如果没有提前确认,后面很容易出现重复数据或历史数据被误处理。
只因为有update_time就选增量字段
要确认业务更新旧数据时是否一定修改update_time。如果应用绕过统一更新时间逻辑,或者批量修正历史数据但时间字段没变,增量字段同步就会漏——而且很难发现。
CDC没演练重启和位点
CDC的复杂点不只在读取日志,还包括任务重启、位点保存、位点重置和初始快照策略。没有演练过这些动作,故障时很难判断该补全量、重放日志还是从新位点继续。
任务完成就认为数据一致
任务完成只代表执行流程结束,不代表业务数据完全一致。目标端写入失败、字段截断、唯一键冲突、字符集问题——都可能让目标端数据少于源端。这里需要结合执行日志、错误数据和SQL校验一起判断。
上线单建议
如果团队使用DataMover管理同步任务,建议上线单至少记录这些内容:
| 项目 | 需要记录的内容 |
|---|---|
| 任务类型 | 全量、增量字段或CDC |
| 源端和目标端 | 数据库类型、库名、表名、账号权限 |
| 目标表策略 | 空表、已有表、清空、追加、写新表 |
| 字段映射 | 主键、增量字段、时间字段、金额字段、字符集 |
| CDC策略 | 是否快照、位点策略、DDL处理方式 |
| 失败处理 | 错误数据查看方式、重跑边界、补数方案 |
| 校验SQL | 行数、时间范围、聚合、抽样 |
| 回退方式 | 目标表备份、临时表切换或重新同步策略 |
全量、增量字段和CDC的选择,本质上是在数据完整性、延迟、实施成本和排障复杂度之间做平衡。同步工具可以降低配置和监控成本,但目标表策略、字段可靠性、日志权限和校验流程——这些硬功夫,仍然要逐项确认,一个都不能省。

