Skip to content

TiDB 迁移工具

TiDB 提供了多种迁移工具,用于将数据从其他数据库迁移到 TiDB,或将 TiDB 数据迁移到其他数据库。这些工具支持全量迁移、增量同步和结构迁移,能够满足不同场景的迁移需求。

迁移工具分类

TiDB 迁移工具可以分为以下几类:

结构迁移工具

  • 功能:将源数据库的表结构迁移到目标数据库
  • 工具:DM、TiDB Lightning、mysqldump
  • 适用场景:首次迁移时的表结构迁移

全量数据迁移工具

  • 功能:将源数据库的全量数据迁移到目标数据库
  • 工具:DM、TiDB Lightning、mysqldump、mydumper/myloader
  • 适用场景:首次迁移时的全量数据迁移

增量数据同步工具

  • 功能:将源数据库的增量变更同步到目标数据库
  • 工具:DM、TiCDC、TiDB Binlog
  • 适用场景:持续数据同步,支持双写或迁移后的增量同步

实时数据同步工具

  • 功能:实时捕获源数据库的变更并同步到目标数据库
  • 工具:TiCDC
  • 适用场景:实时数据同步、数据集成、数据仓库构建

迁移工具比较

工具支持的源数据库支持的迁移类型适用场景优势劣势
DMMySQL、MariaDB全量+增量从 MySQL/MariaDB 迁移到 TiDB支持全量+增量迁移,配置简单仅支持 MySQL 系数据库
TiDB LightningMySQL、CSV全量大规模数据导入导入速度快,支持并行导入仅支持全量导入,不支持增量同步
TiCDCTiDB增量从 TiDB 同步到其他数据库实时同步,支持多种下游仅支持 TiDB 作为源数据库
TiDB BinlogTiDB增量从 TiDB 同步到其他数据库成熟稳定,支持多种下游性能不如 TiCDC,配置复杂
mysqldumpMySQL全量小规模数据迁移简单易用,无需额外工具导入速度慢,不支持并行导入
mydumper/myloaderMySQL全量中等规模数据迁移支持并行导入,速度较快不支持增量同步

DM(Data Migration)

DM 是 TiDB 官方提供的从 MySQL/MariaDB 迁移到 TiDB 的工具,支持全量迁移和增量同步。

1. DM 架构

DM 由以下组件组成:

  • DM-master:负责管理和调度 DM-worker 节点,监控迁移任务状态
  • DM-worker:负责执行具体的迁移任务,包括全量迁移和增量同步
  • dmctl:DM 的命令行工具,用于管理和监控迁移任务

2. DM 部署

使用 TiUP 部署 DM 集群:

bash
# 创建 DM 集群拓扑文件 (dm-topology.yaml)
---
global:
  user: "tidb"
  ssh_port: 22
  deploy_dir: "/tidb-deploy/dm"
  data_dir: "/tidb-data/dm"

master_servers:
  - host: 192.168.0.1

worker_servers:
  - host: 192.168.0.2
  - host: 192.168.0.3

# 部署 DM 集群
tiup dm deploy dm-cluster v7.5.0 dm-topology.yaml --user tidb -p

# 启动 DM 集群
tiup dm start dm-cluster

# 查看 DM 集群状态
tiup dm display dm-cluster

3. DM 配置和使用

创建数据源配置

yaml
# mysql-source.yaml
source-id: "mysql-1"
from:
  host: "192.168.0.100"
  port: 3306
  user: "root"
  password: "password"

创建迁移任务配置

yaml
# migration-task.yaml
name: "test"
source-id: "mysql-1"
target-database:
  host: "192.168.0.200"
  port: 4000
  user: "root"
  password: "password"
task-mode: "all"  # 全量+增量迁移
shard-mode: "pessimistic"  # 悲观模式

mydumper-config-name: "global"  # 引用全局 mydumper 配置
loader-config-name: "global"  # 引用全局 loader 配置
syncer-config-name: "global"  # 引用全局 syncer 配置

# 全局配置
global:
  mydumper-config:
    threads: 4
    chunk-size: 64
    skip-tz-utc: true
  loader-config:
    pool-size: 16
    dir: "/tmp/dm_loader"
  syncer-config:
    worker-count: 16
    batch: 100

# 表路由规则
routes:
  - pattern: "test_db.test_table"
    target-schema: "tidb_db"
    target-table: "tidb_table"

启动迁移任务

bash
# 连接到 DM 集群
tiup dmctl --master-addr=192.168.0.1:8261

# 加载数据源配置
dmctl> operate-source create mysql-source.yaml

# 启动迁移任务
dmctl> start-task migration-task.yaml

# 查看迁移任务状态
dmctl> query-status test

4. DM 最佳实践

  • 合理配置线程数:根据源数据库和目标数据库的性能,合理配置 mydumper、loader 和 syncer 的线程数
  • 使用悲观模式:对于复杂的分库分表迁移,建议使用悲观模式
  • 监控迁移进度:使用 dmctl 或 DM 监控面板监控迁移进度
  • 处理迁移错误:及时处理迁移过程中的错误,如主键冲突、数据类型不兼容等
  • 验证迁移结果:迁移完成后,验证数据的完整性和一致性

TiDB Lightning

TiDB Lightning 是 TiDB 官方提供的大规模数据导入工具,支持从 MySQL 或 CSV 文件导入数据到 TiDB。

1. TiDB Lightning 架构

TiDB Lightning 由以下组件组成:

  • tidb-lightning:主进程,负责协调数据导入
  • tikv-importer:将数据导入到 TiKV 集群(v5.3.0 及以上版本已集成到 tidb-lightning 中)

2. TiDB Lightning 部署

使用 TiUP 安装 TiDB Lightning:

bash
# 安装 TiDB Lightning
tiup install tidb-lightning

# 查看 TiDB Lightning 版本
tiup tidb-lightning --version

3. TiDB Lightning 使用

从 MySQL 导入数据

bash
# 创建 TiDB Lightning 配置文件 (lightning.toml)
[lightning]
# 日志配置
level = "info"
file = "tidb-lightning.log"

# 监控配置
pprof-port = 8289

# 检查点配置
checkpoint.enable = true
checkpoint.schema = "tidb_lightning_checkpoint"

[mydumper]
# MySQL 连接信息
host = "192.168.0.100"
port = 3306
user = "root"
password = "password"
# 要导入的数据库和表
databases = ["test_db"]
tables = [{ db = "test_db", table = "test_table" }]

[tidb]
# TiDB 连接信息
host = "192.168.0.200"
port = 4000
user = "root"
password = "password"
schema = "test_db"

# 启动 TiDB Lightning
tiup tidb-lightning -config lightning.toml

从 CSV 文件导入数据

bash
# 创建 TiDB Lightning 配置文件 (lightning-csv.toml)
[lightning]
level = "info"
file = "tidb-lightning-csv.log"

[checkpoint]
enable = true
schema = "tidb_lightning_checkpoint"

[local]
# CSV 文件目录
data-source-dir = "/data/csv"

[tidb]
host = "192.168.0.200"
port = 4000
user = "root"
password = "password"
schema = "test_db"

# 表结构配置
[tables.test_db.test_table]
# CSV 文件路径
path = "test_table.csv"
# CSV 文件格式
csv.header = true
csv.separator = ","
csv.null = "\\N"

# 启动 TiDB Lightning
tiup tidb-lightning -config lightning-csv.toml

4. TiDB Lightning 最佳实践

  • 使用合适的导入模式:根据 TiKV 集群的规模,选择合适的导入模式(Local 模式或 Importer 模式)
  • 调整并发度:根据 CPU 和内存资源,调整 TiDB Lightning 的并发度
  • 优化 TiKV 配置:在导入数据前,临时调整 TiKV 配置,如关闭自动 compaction
  • 监控导入进度:通过日志或监控面板监控导入进度
  • 验证导入结果:导入完成后,验证数据的完整性和一致性

TiCDC

TiCDC 是 TiDB 官方提供的实时数据同步工具,用于将 TiDB 的变更数据同步到其他数据库或消息队列。

1. TiCDC 架构

TiCDC 由以下组件组成:

  • cdc server:捕获 TiDB 的变更数据,生成变更日志
  • cdc cli:TiCDC 的命令行工具,用于管理和监控同步任务

2. TiCDC 部署

使用 TiUP 部署 TiCDC 集群:

bash
# 编辑 TiDB 集群拓扑文件,添加 TiCDC 配置
tidb_servers:
  - host: 192.168.0.200

tikv_servers:
  - host: 192.168.0.201
  - host: 192.168.0.202
  - host: 192.168.0.203

pd_servers:
  - host: 192.168.0.204

# 添加 TiCDC 配置
cdc_servers:
  - host: 192.168.0.205
    port: 8300
    data_dir: "/tidb-data/cdc"
    deploy_dir: "/tidb-deploy/cdc"

# 部署或扩容 TiDB 集群,添加 TiCDC 节点
tiup cluster scale-out <cluster-name> cdc-topology.yaml

3. TiCDC 使用

创建同步任务

bash
# 创建 TiCDC 同步任务配置文件 (cdc-sink.yaml)
[sink]
type = "mysql"
changefeed-id = "cdc-to-mysql"
pd-addrs = ["192.168.0.204:2379"]

[sink.mysql]
host = "192.168.0.300"
port = 3306
user = "root"
password = "password"
database = "test_db"

# 创建同步任务
tiup ctl cdc changefeed create --sink-uri="mysql://root:password@192.168.0.300:3306/test_db" --pd="192.168.0.204:2379" --changefeed-id="cdc-to-mysql"

# 查看同步任务状态
tiup ctl cdc changefeed list --pd="192.168.0.204:2379"
tiup ctl cdc changefeed query --pd="192.168.0.204:2379" --changefeed-id="cdc-to-mysql"

同步到 Kafka

bash
# 创建同步到 Kafka 的任务
tiup ctl cdc changefeed create --sink-uri="kafka://192.168.0.400:9092/cdc-topic?protocol=canal-json&partition-num=3&replication-factor=1" --pd="192.168.0.204:2379" --changefeed-id="cdc-to-kafka"

4. TiCDC 最佳实践

  • 选择合适的下游协议:根据下游系统,选择合适的同步协议(如 canal-json、avro 等)
  • 调整同步并发度:根据集群规模和负载情况,调整 TiCDC 的同步并发度
  • 监控同步延迟:监控同步任务的延迟,确保数据及时同步
  • 处理同步错误:及时处理同步过程中的错误,如主键冲突、数据类型不兼容等
  • 备份同步数据:对同步到下游的数据进行定期备份,确保数据安全

迁移最佳实践

1. 迁移前准备

  • 评估源数据库:评估源数据库的规模、结构、性能等,制定合理的迁移方案
  • 准备目标环境:部署 TiDB 集群,确保集群规模和性能满足需求
  • 备份源数据:在迁移前,对源数据库进行全量备份,确保数据安全
  • 测试迁移工具:在测试环境中测试迁移工具和迁移流程,确保迁移方案可行
  • 制定回滚计划:制定详细的回滚计划,以防迁移失败

2. 迁移过程

  • 结构迁移:先迁移数据库结构,包括表、索引、视图等
  • 全量数据迁移:使用合适的工具进行全量数据迁移
  • 增量同步:启动增量同步,确保源数据库和目标数据库的数据一致
  • 验证数据一致性:使用工具(如 sync-diff-inspector)验证源数据库和目标数据库的数据一致性
  • 切换业务:在确认数据一致后,将业务切换到 TiDB 集群

3. 迁移后优化

  • 优化 TiDB 配置:根据业务负载,优化 TiDB 集群的配置
  • 创建统计信息:为表创建统计信息,提高查询性能
  • 优化索引:根据查询模式,优化表的索引
  • 监控集群性能:监控 TiDB 集群的性能,及时发现和解决问题
  • 培训业务人员:培训业务人员使用 TiDB,熟悉 TiDB 的特性和最佳实践

迁移故障排除

1. 迁移速度慢

可能原因

  • 源数据库性能不足
  • 目标数据库性能不足
  • 网络带宽有限
  • 迁移工具配置不合理
  • 并发度设置过低

解决方案

  • 优化源数据库:优化源数据库的配置和性能
  • 优化目标数据库:优化 TiDB 集群的配置和性能
  • 增加网络带宽:确保源数据库和目标数据库之间的网络带宽充足
  • 调整迁移工具配置:根据源数据库和目标数据库的性能,调整迁移工具的配置
  • 增加并发度:适当增加迁移工具的并发度,提高迁移速度

2. 迁移数据不一致

可能原因

  • 迁移过程中源数据库有写入
  • 迁移工具存在 bug
  • 数据类型不兼容
  • 主键冲突

解决方案

  • 停止源数据库写入:在全量迁移期间,停止源数据库的写入操作
  • 使用增量同步:使用增量同步工具,确保源数据库和目标数据库的数据一致
  • 验证数据类型:在迁移前,验证源数据库和目标数据库的数据类型兼容性
  • 处理主键冲突:在迁移前,确保源数据库和目标数据库的主键不冲突
  • 使用数据验证工具:使用 sync-diff-inspector 等工具验证数据一致性

3. 迁移任务失败

可能原因

  • 配置错误
  • 网络连接问题
  • 源数据库或目标数据库不可用
  • 迁移工具 bug
  • 资源不足

解决方案

  • 检查配置文件:检查迁移工具的配置文件是否正确
  • 检查网络连接:确保源数据库和目标数据库之间的网络连接正常
  • 检查数据库状态:确保源数据库和目标数据库状态正常
  • 更新迁移工具:将迁移工具更新到最新版本,修复已知 bug
  • 增加资源:增加迁移工具的 CPU、内存等资源

常见问题(FAQ)

Q1: 从 MySQL 迁移到 TiDB,应该选择哪个工具?

A1: 根据数据规模和迁移需求选择合适的工具:

  • 小规模数据(`< 10GB):使用 mysqldump
  • 中等规模数据(10GB - 100GB):使用 mydumper/myloader
  • 大规模数据(>` 100GB):使用 TiDB Lightning 进行全量迁移,然后使用 DM 进行增量同步
  • 需要全量+增量迁移:使用 DM

Q2: 如何验证迁移后的数据一致性?

A2: 使用 sync-diff-inspector 工具验证数据一致性:

bash
# 创建 sync-diff-inspector 配置文件 (sync-diff.toml)
# 配置源数据库和目标数据库信息
# 运行 sync-diff-inspector
tiup sync-diff-inspector -config sync-diff.toml

Q3: 迁移过程中,源数据库可以继续写入吗?

A3: 可以,但需要使用支持增量同步的工具,如 DM。在迁移过程中,源数据库的写入会通过增量同步同步到目标数据库,确保数据一致性。

Q4: TiDB Lightning 和 DM 有什么区别?

A4: TiDB Lightning 主要用于大规模数据导入,支持从 MySQL 或 CSV 文件导入数据到 TiDB,仅支持全量导入。DM 主要用于从 MySQL/MariaDB 迁移到 TiDB,支持全量迁移和增量同步。

Q5: 如何监控迁移任务的进度?

A5: 可以通过以下方式监控迁移任务的进度:

  • 查看迁移工具的日志
  • 使用迁移工具的命令行工具查看任务状态
  • 通过监控面板查看迁移指标
  • 使用第三方监控工具,如 Prometheus 和 Grafana

Q6: 迁移完成后,需要做哪些优化?

A6: 迁移完成后,需要做以下优化:

  • 为表创建统计信息
  • 优化表的索引
  • 调整 TiDB 集群的配置
  • 监控集群的性能
  • 培训业务人员使用 TiDB

Q7: 如何处理迁移过程中的错误?

A7: 处理迁移过程中的错误,需要:

  • 查看错误日志,了解错误原因
  • 根据错误原因,采取相应的解决措施
  • 对于可以忽略的错误,使用工具的跳过错误功能
  • 对于严重错误,停止迁移任务,修复问题后重新启动

Q8: 迁移后,业务查询性能下降怎么办?

A8: 如果迁移后业务查询性能下降,可以:

  • 优化查询语句
  • 调整 TiDB 集群的配置
  • 优化表的索引
  • 增加 TiDB 集群的资源
  • 使用 TiFlash 加速分析查询