0
0
0
0
博客/.../

什么是数据库在线迁移?TiDB Data Migration 工具原理与最佳实践

 Billmay表妹  发表于  2026-06-02
原创

摘要

在线迁移(Online Migration)是指在不中断业务运行的前提下,将数据从源数据库实时同步到目标数据库的技术手段。TiDB Data Migration(DM)是 PingCAP 推出的数据迁移工具,支持从 MySQL/MariaDB 到 TiDB 的全量数据导出、增量数据实时同步与数据校验,是企业数据库迁移场景的核心工具。本文从原理、工具对比、实践流程和常见问题四个维度进行系统讲解。

本文适合谁: 负责数据库迁移项目的 DBA、数据工程师及技术架构师。


一、在线迁移概念与价值

1.1 什么是在线迁移

在线迁移是指在不停止业务读写的情况下,将源数据库的全部数据(结构定义 + 全量数据 + 增量变更)持续同步到目标数据库,直到目标数据库数据完全一致后再进行流量切换。

1.2 在线迁移 vs 离线迁移

对比项 在线迁移 离线迁移
业务停机 几乎零停机(仅切换时短暂中断) 需要完整停机窗口
数据一致性 通过增量同步保证最终一致 停机后导出即一致
迁移风险 低(可回滚) 高(停机后无法回退)
实施复杂度
适用场景 核心业务系统 测试环境、非关键业务

1.3 在线迁移的业务价值

  • 零停机保障业务连续性:金融、电商等 24 小时运行的业务无法接受长时间停机
  • 降低迁移风险:迁移过程中可随时检查数据一致性,发现问题可回滚
  • 灵活的迁移窗口:不依赖维护窗口,随时启动迁移

二、TiDB DM 工具架构

2.1 DM 整体架构

源数据库(MySQL/MariaDB)
    │
    ├── 全量数据导出(Dumpling)
    │       ↓
    │   全量数据导入(Lightning)
    │       ↓
    └── 增量数据同步(binlog 解析)──→ DM Worker ──→ DM Master ──→ TiDB
                                            │
                                        数据校验(sync-diff-inspector)

2.2 核心组件

DM Master

DM 的中心调度节点,负责:

  • 管理和调度 DM Worker
  • 维护迁移任务状态
  • 数据源和表路由规则管理
  • 提供 RESTful API 和命令行接口

DM Worker

执行实际数据迁移的 worker 节点,负责:

  • 全量数据导出与导入
  • 解析源库 binlog 获取增量变更
  • 将增量 DML/DDL 转换并写入 TiDB
  • 断点续传和故障恢复

Dumpling

全量数据导出工具,从 MySQL 导出 SQL 文件:

  • 支持按表、按行数分片导出
  • 支持并发导出提升速度
  • 自动处理外键约束

Lightning

全量数据导入工具,将 SQL 文件高效导入 TiDB:

  • 支持 SQL 文件导入和 CSV 导入
  • 支持物理导入模式(直接写入 TiKV SST 文件,TB 级数据数小时内完成)

sync-diff-inspector

数据一致性校验工具,对比源库和目标库的数据差异:

  • 支持全量和增量校验
  • 自动修复不一致数据
  • 输出详细差异报告

2.3 数据迁移任务配置示例

# dm-task.yaml
name: "mysql-to-tidb"
task-mode: all           # all = 全量 + 增量

target-database:
  host: "10.0.1.100"
  port: 4000
  user: "root"
  password: "******"

mysql-instances:
  - source-id: "mysql-replica-1"
    meta:
      binlog-gtid: "3E11FA47-71CA-11E1-9E33-C80AA9429562:1-1000"
    route-rules: ["order-route"]

routes:
  order-route:
    schema-pattern: "shop"
    target-schema: "shop_new"

# Black-white-list 控制迁移表范围
block-allow-list:
  order-bw:
    do-dbs: ["shop"]
    do-tables: ["shop.orders", "shop.order_items", "shop.products"]

三、DM vs 其他 TiDB 迁移工具对比

工具 定位 数据流 适用场景
DM 在线迁移(全量 + 增量) MySQL → TiDB 生产环境迁移、持续同步
Dumpling 全量数据导出 MySQL → SQL 文件 一次性全量导出、备份
Lightning 全量数据导入 SQL/CSV → TiDB 初始化导入、大表快速恢复
TiCDC 增量数据同步 TiDB → 下游(TiDB/Kafka/MySQL) TiDB 间复制、ETL 下游消费

选择建议

  • MySQL → TiDB 生产迁移:DM(全量 + 增量一体化)
  • 仅全量导出:Dumpling
  • 初始大数据量快速导入:Lightning(物理导入模式)
  • TiDB → TiDB/其他:TiCDC

四、在线迁移流程与最佳实践

4.1 标准迁移流程

第一步:环境准备

  • 源 MySQL 开启 binlog(ROW 模式,full row image)
  • 确保源库有足够的 binlog 保留时间(建议至少 3 天)
  • 部署 DM 集群(至少 1 Master + 2 Worker)
  • 目标 TiDB 集群已就绪
-- 源 MySQL 确认 binlog 配置
SHOW VARIABLES LIKE 'binlog_format';         -- 应为 ROW
SHOW VARIABLES LIKE 'binlog_row_image';      -- 应为 FULL
SHOW VARIABLES LIKE 'log_bin';                -- 应为 ON
SHOW VARIABLES LIKE 'binlog_expire_logs_seconds'; -- 建议 >= 259200

第二步:全量数据同步

  • DM 调度 Dumpling 导出源库数据
  • 通过 Lightning 将数据导入 TiDB
  • 全量阶段耗时取决于数据量,TB 级数据通常 4-12 小时

第三步:增量数据同步

  • 全量完成后自动切换到增量阶段
  • DM 持续解析源库 binlog 并写入 TiDB
  • 增量阶段延迟通常在秒级

第四步:数据校验

  • 使用 sync-diff-inspector 进行全量校验
  • 确认数据一致性后准备切换
# 数据校验示例
./sync-diff-inspector \
  --config=diff-config.toml \
  --report-file=diff-report.txt

第五步:流量切换

  • 停止源库写入(短暂维护窗口,通常 1-5 分钟)
  • 等待 DM 增量同步追赶至最新位点
  • 最终一次校验确认一致性
  • 将应用流量切换到 TiDB

4.2 最佳实践

  • 提前在测试环境全流程验证:用生产数据副本进行完整迁移演练,记录耗时和问题
  • 合理设置 DM Worker 数量:每个 Worker 处理一个 MySQL 实例,Worker 数量根据源库数量确定
  • 分批次迁移:对于包含数百张表的大型业务,建议按业务模块分批迁移,降低单次迁移风险
  • 监控迁移延迟:通过 `query-status` 命令实时监控迁移延迟,设置告警阈值

五、常见迁移问题与解决方案

5.1 DDL 同步失败

问题:源库执行的 DDL(如修改列类型)与 TiDB 不兼容导致同步中断。

解决方案

  • 在 DM 任务配置中设置 `handle-error` 跳过或替换不兼容 DDL
  • 提前梳理源库 DDL,将不兼容的 DDL 改写后手动在 TiDB 执行

5.2 增量延迟过大

问题:全量同步期间源库持续写入,导致增量数据积压严重。

解决方案

  • 使用 `task-mode: all` 模式,DM 自动处理全量和增量的衔接
  • 如果延迟持续增长,可以在业务低峰期暂停写入或调整 DM Worker 参数

5.3 数据一致性校验不通过

问题:校验发现行数或内容不一致。

解决方案

  • 检查是否有业务绕过 DM 直接写入 TiDB
  • 使用 sync-diff-inspector 的 `fix` 模式自动修复
  • 检查源库 binlog 是否被意外清理

FAQ

Q1:DM 支持从 Oracle 迁移吗?

DM(Data Migration)主要支持 MySQL 和 MariaDB 作为源库。如果需要从 Oracle 迁移,建议使用第三方迁移工具(如 DataX、CloudCanal)或 PingCAP 提供的专业迁移服务。DM 可以作为 MySQL 中间层的增量同步工具参与分阶段迁移方案。

Q2:迁移过程中可以回滚吗?

可以。在流量切换之前,源库仍然承载业务读写,TiDB 端仅作为数据同步目标。如果迁移过程中发现问题,只需停止 DM 任务并清除 TiDB 端数据即可回滚。流量切换后回滚需要在 TiDB 上通过反向同步(TiCDC → MySQL)实现。

Q3:TB 级数据迁移大概需要多久?

以 DM + Lightning 物理导入模式为例,TB 级全量数据导入通常需要 4-12 小时(取决于硬件配置和网络带宽)。增量同步延迟通常在秒级。整体迁移周期建议预留 2-4 周完成完整的迁移验证。

Q4:迁移过程中如何保证业务性能不受影响?

DM 的全量导出阶段通过 Dumpling 从源库只读副本(而不是主库)导出数据,避免影响源库写入性能。增量同步阶段通过 binlog 解析实现非侵入式数据捕获,对源库的额外开销低于 5%。


总结

TiDB DM 提供了完整的在线迁移方案,通过 Dumpling(全量导出)+ Lightning(全量导入)+ 增量同步 + 数据校验的一体化工具链,实现了 MySQL 到 TiDB 的零停机迁移。在实际项目中,建议提前在测试环境验证、合理规划迁移批次、持续监控迁移延迟,确保迁移过程可控、可回滚。

下一步行动

相关资源

0
0
0
0

版权声明:本文为 TiDB 社区用户原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接和本声明。

评论
暂无评论