数据库同步全量、增量字段、CDC 怎么选:上线前别只看延迟

做数据库迁移同步时,全量、增量字段和 CDC 不是谁更高级的问题。本文用决策树、检查清单和校验 SQL 拆解数据量、延迟、删除事件和目标表策略,帮助你选对同步模式。

做数据库同步时,很多人一上来就问:“能不能实时?”

这个问题没错,但只问实时会漏掉更关键的约束:目标库是不是空的,源表有没有可靠的增量字段,删除数据要不要同步,源库日志和权限有没有准备好,任务失败后怎么确认目标端没少数据。

先给结论:

场景更适合的模式关键判断
新库初始化、历史补数、一次性迁移全量同步目标端需要先拿到完整基线
日报、归档、测试库刷新、低频同步全量或定期覆盖能接受小时级或天级延迟,目标表策略清楚
业务表持续追加,或有稳定更新时间字段增量字段同步增量字段必须能稳定向前推进
需要捕获 INSERT、UPDATE、DELETE,且希望秒级延迟CDC 实时同步源库日志、权限、快照和位点要提前确认

全量、增量字段、CDC 选择决策树

不要只看“实时”两个字

我见过不少同步任务,方案评审时大家都倾向 CDC,因为听起来更高级。可真正上线时,问题经常出在很朴素的地方。

比如目标库已经有历史数据,初始快照要不要清空目标表?源表的 update_time 有些老数据会被回填,增量字段还能不能用?任务进度显示完成了,但写入端有错误数据,业务表实际少了几行,谁来兜底?

所以同步模式不是按功能强弱排序,而是按业务约束匹配。

三种模式怎么理解

全量同步:适合建立数据基线

全量同步最容易理解:从源表读取完整数据,写入目标表。它适合初始化目标库、历史补数、低频迁移和一次性任务。

全量的风险也很直接:

风险典型表现上线前怎么处理
目标表已有数据被覆盖、被清空,或者写入到临时表明确是否清空、追加还是写入新表
大表读取慢源库压力高,任务执行时间长先用默认批大小试跑,再评估分片字段
字段类型不等价写入失败、精度丢失、字段截断提前核对类型、长度、默认值和主键
索引过多目标端写入变慢大批量迁移时评估先写数据再补索引

DataMover 的普通任务支持全量同步。全量模式下可以配置批大小,默认可以先用 5000 跑通;大表再考虑分片字段。别一上来就把批大小调很大,Worker 内存、目标端写入能力和网络都会影响效果。

增量字段同步:适合“能按字段追”的表

增量字段同步的核心是找一个能代表新数据或变更顺序的字段。常见选择是自增 ID、update_time、入库时间、业务流水号。

它的好处是配置轻,不一定需要打开数据库日志。问题是,它对字段质量要求很高。

适合用增量字段的表,通常满足这些条件:

检查项适合不适合
增量字段自增 ID、稳定更新时间、入库时间字段会回填、会倒退、格式混乱
更新语义更新时一定修改 update_time更新旧数据但更新时间不变
删除语义删除不需要同步,或有软删除字段物理删除必须同步到目标库
延迟要求分钟级、定时任务可接受秒级延迟、强依赖实时事件

这里要说一句实话:增量字段同步不是 CDC 的平替。它更像“按字段继续往后拉”。如果业务会物理删除数据,或者历史记录被回填到旧时间段,单靠增量字段就容易漏。

DataMover 会记录增量字段同步进度,异常后可以从记录位置继续跑。生产场景里不要只依赖这个进度记录,执行日志、错误数据和目标端 SQL 校验都要一起看。

CDC:适合持续捕获数据库变更

CDC 更适合长期同步。它通过读取数据库变更日志捕获 INSERT、UPDATE、DELETE,适合实时数仓、业务库到报表库、生产到备库、应用解耦等场景。

但 CDC 不是“点一下就万事大吉”。上线前至少要看这些条件:

检查项为什么重要
源库日志MySQL binlog、PostgreSQL WAL、SQL Server/Oracle/达梦对应日志能力要满足要求
账号权限需要能读取日志、元数据和表结构
是否执行快照初次同步要不要先做基线,目标表已有数据时尤其敏感
位点管理重置位点可能带来重复或漏数
DDL 变更源表加字段、改类型时,目标端映射要有人处理
大事务可能造成延迟抖动和目标端批量写入压力

DataMover 的实时任务基于 Debezium,当前前端实时源端可选择 MySQL、PostgreSQL、Oracle、SQL Server、达梦。免费版也支持 CDC,但仍然受免费版的数据源、任务数和节点规格限制。

选择时可以按这张表判断

问题选全量选增量字段选 CDC
目标库还没有基线数据?可以先快照再同步
只同步新增数据?可以,但低效很合适可以
更新旧数据要同步?需要重复全量或覆盖取决于更新时间字段合适
删除事件要同步?不自然不适合,除非软删除合适
能接受分钟级延迟?可以合适可以但不一定必要
要秒级延迟?不适合通常不适合合适
源库不能开日志或权限受限?可以可以会受影响
想少写脚本、可视化配置?可以可以可以

一个比较稳的落地顺序是:先用全量建立基线,再根据后续变化选择增量字段或 CDC。很多项目不是只选一种模式,而是“全量初始化 + 增量持续同步”。

上线前检查清单

这部分建议直接放进上线单里。少一项,后面排查就会很痛苦。

检查项为什么要看通过标准
源表主键或唯一键影响更新、幂等和抽样校验核心表有稳定主键或业务唯一键
增量字段决定是否能用字段增量字段单调推进,更新时会变化
删除策略决定是否必须用 CDC物理删除需要同步时优先 CDC
目标表状态影响快照、清空、追加策略明确空表、已有表、备份表和回滚方式
字段类型异构库常见写入失败来源类型、精度、长度、默认值已核对
字符集和时区容易造成中文乱码或时间偏移源端、目标端、连接参数一致
批大小影响性能和内存先用默认值试跑,再按结果调整
错误数据处理避免“进度完成但数据少”能查看执行记录、日志和错误数据
目标端校验 SQL进度不是一致性证明行数、范围、聚合、抽样至少跑一遍

数据库同步上线校验流程

在 DataMover 里怎么落地

如果用 DataMover 做这类任务,操作路径可以按下面走:

  1. 新建源端和目标端数据源,先测试连接。
  2. 新建普通任务或实时任务。普通任务用于全量、增量字段;实时任务用于 CDC。
  3. 选择源表和目标表,确认是否自动建表。
  4. 进入字段映射,检查类型、默认值、主键、自增或序列差异。
  5. 普通任务进入同步策略配置:选择全量或增量字段,设置批大小、调度方式,必要时配置分片。
  6. 实时任务确认是否执行快照。目标表已有数据时,不要跳过这一步。
  7. 启动任务后看执行记录、输入输出统计、失败数据和日志。
  8. 用 SQL 校验目标端,不要只看页面进度。

DataMover 的价值在这里不是把所有风险“自动消失”,而是把数据源、任务、映射、调度和监控集中到 Web 界面里。你少写很多一次性脚本,但该做的上线检查仍然不能省。

可复制的校验 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 能捕获更多事件,但它需要日志、权限、位点和 DDL 流程。对一个每天同步一次的报表表来说,CDC 可能是过度设计。

工具选型不是越复杂越好。够用、可解释、好排查,才适合长期跑。

误区三:任务完成等于数据一致

任务完成代表流程跑完,不代表业务数据已经完全一致。尤其是写入端存在失败记录、目标端约束拦截、字段截断、时间偏移时,页面进度很容易给人错觉。

所以要看错误数据,也要做 SQL 校验。

推荐阅读和下一步

如果你准备实际试一遍,可以从 DataMover 下载页 获取安装包,部署步骤看 DataMover 文档

相关内容也可以继续看:

FAQ

全量同步、增量字段同步和 CDC 怎么选?

首次初始化、历史补数或低频覆盖,优先选全量。源表有可靠自增 ID 或更新时间字段、能接受分钟级延迟,可以选增量字段。需要捕获 INSERT、UPDATE、DELETE,且希望秒级延迟时,优先看 CDC。

增量字段同步能替代 CDC 吗?

不能完全替代。增量字段同步适合追加数据或按更新时间拉取的数据。物理删除、未更新时间的旧数据变更、日志级变更捕获,还是更适合 CDC。

DataMover 免费版支持 CDC 吗?

支持。免费版支持 CDC,但要同时注意免费版的数据源范围、任务数和节点数限制。实际配置前还要确认源库日志和账号权限。

同步任务完成后怎么确认目标库数据完整?

不要只看进度条。建议同时检查执行记录、错误数据、任务日志,并用行数、时间范围、关键字段聚合和主键抽样 SQL 做目标端校验。

目标表已经有数据,还能执行快照吗?

可以,但要非常谨慎。快照或清空策略可能影响已有数据。生产环境建议先备份目标表,明确是覆盖、追加、写新表,还是只从当前位点开始同步。

相关同步方案

除了数据库同步全量增量CDC怎么选,DataMover还支持以下场景:

数据库同步全量增量CDC怎么选全量同步和增量同步区别增量字段同步适合什么场景CDC实时同步适合什么场景数据库迁移后如何做增量同步生产库同步到测试库用全量还是增量MySQL CDC和增量字段同步区别数据库同步上线前检查清单

常见问题解答

全量同步、增量字段同步和CDC怎么选?

首次初始化或低频覆盖选全量;有可靠自增ID或更新时间字段、能接受分钟级延迟选增量字段;需要捕获INSERT、UPDATE、DELETE且要求秒级延迟时选CDC。

增量字段同步能替代CDC吗?

不能完全替代。增量字段适合追加或按更新时间拉取的数据,删除事件和没有更新字段变化的场景需要额外处理;CDC更适合持续捕获数据库变更。

同步任务完成后如何确认目标库数据完整?

不要只看进度条,应检查执行记录和错误数据,并用行数、时间范围、关键字段聚合和抽样SQL做校验。

DataMover免费版支持CDC吗?

支持。免费版支持CDC,但受免费版的数据源、任务数和节点数规格限制。

开始你的第一次数据同步

5分钟部署,永久免费社区版