我在同步任务上线前,重新梳理了一遍全量、增量字段和 CDC

最近做一个数据库同步任务,上线评审时大家卡在一个问题上:到底用全量、增量字段,还是直接上 CDC?

这个问题看着像工具选型,其实更像风险控制。同步任务不是跑完就行,真正麻烦的是目标端数据能不能对得上,失败以后能不能解释清楚,后续变更有没有漏。

我把这次梳理过程记下来,方便以后遇到类似任务时直接复用。中间用到 DataMover 做配置验证,它只是工具,重点还是判断逻辑和上线检查。后文里提到的普通任务、实时任务、字段映射和执行记录,都是基于 DataMover 的实际配置入口来写的。

我先按业务问题分了一层

问题 倾向模式 原因
目标库还没有历史数据 全量 需要先建立完整基线
只是低频刷新测试库或报表库 全量或定期覆盖 延迟要求不高,链路简单
源表有稳定自增 ID 或更新时间字段 增量字段 可以按字段持续推进
必须同步 UPDATE 和 DELETE CDC 字段增量不一定能捕获这些事件
要求秒级延迟 CDC 普通调度通常不适合
源库日志权限申请困难 全量或增量字段 CDC 前置条件不满足

1-决策树

如果你也想用工具快速验证这套判断,DataMover 是一个可视化的数据迁移同步工具,可以在 Web 界面里配置全量、增量字段和 CDC。Docker 环境可以直接拉起:

curl -fsSL https://down.datamover.cn/install.sh | bash

安装包入口:https://datamover.cn/download.html
文档地址:https://datamover.cn/doc/

这个图里的关键点是:不要把 CDC 当成默认答案。CDC 更完整,但也更依赖源库日志、权限、位点和 DDL 流程。

全量同步:最简单,也最容易被误用

全量同步适合初始化,没什么悬念。源表读完整,目标表写完整。

容易出问题的地方是目标表状态。

如果目标表是空的,全量很好办。如果目标表已经有数据,就必须提前定规则:

  • 是清空后重写?
  • 是追加写入?
  • 是写到新表再切换?
  • 是写临时表给人工核对?

这个不说清楚,后面很容易出现“任务跑成功了,但历史数据被覆盖了”的问题。

大表全量也要注意批大小。DataMover 普通任务里可以设置批大小,我一般先用默认值跑通一张小表,再根据 Worker 内存、目标端写入速度和网络情况调整。批大小不是越大越快。

增量字段同步:核心是字段是否可信

增量字段同步经常被低估。它配置简单,不一定需要打开数据库日志,适合很多定时同步任务。

但它有一个前提:增量字段必须可信。

我会检查这些点:

检查项 可以用 风险较高
字段类型 自增 ID、时间戳、入库时间 字符串时间且格式混乱
字段变化 每次更新都会变 更新旧数据但字段不变
推进方向 单调递增或稳定向前 业务会回填历史时间
删除处理 不需要同步删除,或有软删除 物理删除必须同步

这里最容易踩坑的是 update_time。很多业务系统看起来有更新时间字段,但部分批处理、历史修复脚本、手工 SQL 并不维护它。只要这类情况存在,单靠字段增量就可能漏。

DataMover 会记录增量字段同步进度,任务异常后可以从记录位置继续跑。但这个记录不能替代一致性校验。尤其是写入端有失败数据时,读取进度和目标端完整性是两件事。

CDC:强在完整,难在前置条件

CDC 适合长期变更捕获,尤其是要同步删除事件、更新事件、秒级变更的场景。

我这次重点检查了这些项:

检查项 说明
日志配置 MySQL binlog、PostgreSQL WAL、SQL Server/Oracle/达梦的变更日志能力
权限 复制权限、元数据读取权限、表读取权限
快照 是否先做初始快照,目标表已有数据时要谨慎
位点 重置位点可能重复,也可能漏
DDL 源表字段变化后,目标表和映射要有人处理
大事务 可能造成延迟抖动和目标端写入压力

DataMover 的实时任务基于 Debezium,配置时会把普通任务和实时任务区分开。普通任务用于全量/增量字段,实时任务用于 CDC。这个区分能减少很多“参数混着配”的问题。

实际配置流程

我的操作顺序是:

  1. 建源端数据源和目标端数据源,测试连接。
  2. 新建任务,按场景选择普通任务或实时任务。
  3. 选表,确认目标表是否自动创建。
  4. 检查字段映射,尤其是类型、长度、默认值、主键。
  5. 普通任务里配置全量或增量字段。
  6. 增量任务配置调度方式,比如间隔或 Cron。
  7. 实时任务确认是否执行快照。
  8. 启动后看执行记录、失败数和日志。

这套流程没有什么花活,但能把问题暴露得比较早。

2-上线校验流程

我会保留的一份上线检查清单

检查项 原因 通过标准
源表主键 校验和更新都依赖它 核心表有稳定主键或唯一键
增量字段 决定字段增量是否可靠 不回退,更新时会变化
删除策略 决定是否要 CDC 物理删除必须同步时不用字段增量糊弄
目标表状态 防止误清空或误覆盖 有备份和回滚方案
字段类型 异构库写入失败的常见来源 长度、精度、默认值都确认
字符集/时区 中文乱码和时间偏移常见 源端、目标端、连接参数一致
错误数据 进度完成不代表一致 失败记录可下载、可追踪
SQL 校验 最终确认靠目标端查询 行数、范围、聚合、抽样都通过

SQL 校验

我一般不会只看 count。count 只能说明行数,不能说明金额、状态、时间字段都一致。

-- 行数
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;

目标端同样跑一遍,对比结果。

几点经验

  • CDC 不是默认答案,它只是能覆盖更多变更事件。
  • 增量字段同步够用时,不要把系统复杂度拉得太高。
  • 全量同步适合建立基线,但目标表策略必须写清楚。
  • 任务进度完成不等于数据一致。
  • 写入失败如果被记录为错误数据,后续校验一定要跟上。

DataMover 的官网和文档放这里,后续查参数时用得到。如果团队里已经把 DataMover 作为同步任务入口,建议把这份检查清单也放到任务上线单里:

posted @ 2026-06-09 16:35  Gengry  阅读(35)  评论(0)    收藏  举报