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. 创建目标库表结构(异步任务 1)
  2. 全量数据导出(异步任务 2,分片并行)
  3. 全量数据导入(异步任务 3,校验行数)
  4. 增量 binlog 追平(异步任务 4,持续运行)
  5. 一致性校验(异步任务 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 分钟执行一次增量延迟校验。只有当两项校验均通过时,才允许进入切换割接阶段。