4. 迁移场景分类:同构迁移、异构迁移、增量迁移、全量+增量迁移
数据库迁移的异步任务数据一致性策略,首先取决于迁移场景的类型。不同的迁移场景对数据一致性模型、冲突检测机制、回滚策略和校验方式有截然不同的要求。本章将迁移场景划分为四种核心类型,并分析每种场景下的异步任务一致性挑战。
4.1 迁移场景分类矩阵
| 迁移类型 | 源端与目标端 | 数据模型 | 一致性难点 | 典型工具 |
|---|---|---|---|---|
| 同构迁移 | 相同数据库引擎(MySQL → MySQL) | 完全一致 | DDL 同步、自增主键冲突 | mysqldump、XtraBackup |
| 异构迁移 | 不同数据库引擎(Oracle → MySQL) | 需转换 | 数据类型映射、函数兼容性 | DataX、Kettle |
| 增量迁移 | 持续变更的源库 | 实时同步 | 断点续传、幂等写入 | Debezium、Canal |
| 全量+增量迁移 | 存量数据 + 实时变更 | 混合模式 | 一致性快照、切换窗口 | DTS、DM |
4.2 同构迁移
同构迁移指源端和目标端使用相同数据库引擎(如 MySQL 5.7 → MySQL 8.0)。由于数据模型完全一致,异步任务主要关注 DDL 同步 和 自增主键冲突。
关键实践: 同构迁移中,异步任务应使用
ROW 格式的 binlog 解析,避免 STATEMENT 格式带来的不确定性。DDL 变更需通过异步任务队列顺序执行,并记录每个 DDL 的 checksum。
4.2.1 同构迁移异步任务流程
- 创建目标库表结构(异步任务 1)
- 全量数据导出(异步任务 2,分片并行)
- 全量数据导入(异步任务 3,校验行数)
- 增量 binlog 追平(异步任务 4,持续运行)
- 一致性校验(异步任务 5,抽样对比)
4.3 异构迁移
异构迁移涉及不同数据库引擎(如 Oracle → MySQL、SQL Server → PostgreSQL)。异步任务必须处理 数据类型映射、函数兼容性 和 SQL 方言转换。
常见陷阱: Oracle 的
NUMBER(38,0) 映射到 MySQL 的 DECIMAL(38,0) 时,异步任务若未做精度截断校验,可能导致写入失败。建议在异步任务中增加 预转换校验步骤。
4.3.1 数据类型映射示例
| Oracle 类型 | MySQL 类型 | 异步任务处理策略 |
|---|---|---|
| VARCHAR2(4000) | VARCHAR(4000) | 直接映射,检查字符集 |
| NUMBER(38,0) | DECIMAL(38,0) | 精度截断校验 |
| DATE | DATETIME(6) | 时区转换 |
| CLOB | LONGTEXT | 分片读取,避免 OOM |
| BLOB | LONGBLOB | Base64 编码传输 |
4.4 增量迁移
增量迁移只处理源库的持续变更数据,不涉及存量数据。异步任务的核心挑战是 断点续传 和 幂等写入。
推荐方案: 使用 Log Sequence Number (LSN) 或 binlog 文件名+偏移量 作为断点标记。异步任务每次消费后,将断点持久化到外部存储(如 ZooKeeper 或数据库表),确保任务重启后能从正确位置继续。
4.4.1 增量迁移异步任务状态机
状态: INIT → RUNNING → PAUSED → RUNNING → COMPLETED
事件:
- 启动任务: INIT → RUNNING
- 消费到空事件: RUNNING → PAUSED (等待新数据)
- 新数据到达: PAUSED → RUNNING
- 手动停止: RUNNING → COMPLETED
4.5 全量+增量迁移
全量+增量迁移是最复杂的场景,需要先迁移存量数据,再追平增量变更,最终在切换窗口完成割接。异步任务必须保证 一致性快照 和 无缝切换。
核心原则: 全量迁移开始时,必须记录源库的全局一致性位点(如 MySQL 的
GTID_SET 或 MASTER_LOG_FILE + MASTER_LOG_POS)。增量迁移从此位点开始消费,确保全量与增量数据在时间线上无缝衔接。
4.5.1 全量+增量迁移阶段划分
| 阶段 | 任务 | 一致性保证 |
|---|---|---|
| 阶段一 | 记录一致性位点 | 全局读锁或 MVCC 快照 |
| 阶段二 | 全量数据导出 | 分片导出,记录每片水位线 |
| 阶段三 | 全量数据导入 | 目标端禁用外键约束 |
| 阶段四 | 增量追平 | 断点续传,延迟监控 |
| 阶段五 | 一致性校验 | 行数 + checksum 对比 |
| 阶段六 | 切换割接 | 停写源库,验证目标库 |
4.6 迁移场景选择决策树
以下 SVG 图展示了根据业务需求选择迁移场景的决策路径。
4.7 各场景异步任务一致性策略对比
| 迁移场景 | 一致性模型 | 冲突检测 | 回滚策略 | 校验方式 |
|---|---|---|---|---|
| 同构迁移 | 最终一致性 | 主键冲突跳过 | 全量重导 | 行数 + 最大主键 |
| 异构迁移 | 最终一致性 | 类型转换异常 | 单条回滚 | 抽样字段对比 |
| 增量迁移 | 因果一致性 | 幂等写入 | 断点重置 | 延迟监控 |
| 全量+增量迁移 | 快照一致性 | 位点冲突 | 全量重导 + 增量重置 | 全量 checksum + 增量延迟 |
实践建议: 对于全量+增量迁移,建议在异步任务中实现 双轨校验:全量阶段结束后立即执行一次全量 checksum,增量追平阶段每 5 分钟执行一次增量延迟校验。只有当两项校验均通过时,才允许进入切换割接阶段。