外观
TiDB 迁移工具
TiDB 提供了多种迁移工具,用于将数据从其他数据库迁移到 TiDB,或将 TiDB 数据迁移到其他数据库。这些工具支持全量迁移、增量同步和结构迁移,能够满足不同场景的迁移需求。
迁移工具分类
TiDB 迁移工具可以分为以下几类:
结构迁移工具
- 功能:将源数据库的表结构迁移到目标数据库
- 工具:DM、TiDB Lightning、mysqldump
- 适用场景:首次迁移时的表结构迁移
全量数据迁移工具
- 功能:将源数据库的全量数据迁移到目标数据库
- 工具:DM、TiDB Lightning、mysqldump、mydumper/myloader
- 适用场景:首次迁移时的全量数据迁移
增量数据同步工具
- 功能:将源数据库的增量变更同步到目标数据库
- 工具:DM、TiCDC、TiDB Binlog
- 适用场景:持续数据同步,支持双写或迁移后的增量同步
实时数据同步工具
- 功能:实时捕获源数据库的变更并同步到目标数据库
- 工具:TiCDC
- 适用场景:实时数据同步、数据集成、数据仓库构建
迁移工具比较
| 工具 | 支持的源数据库 | 支持的迁移类型 | 适用场景 | 优势 | 劣势 |
|---|---|---|---|---|---|
| DM | MySQL、MariaDB | 全量+增量 | 从 MySQL/MariaDB 迁移到 TiDB | 支持全量+增量迁移,配置简单 | 仅支持 MySQL 系数据库 |
| TiDB Lightning | MySQL、CSV | 全量 | 大规模数据导入 | 导入速度快,支持并行导入 | 仅支持全量导入,不支持增量同步 |
| TiCDC | TiDB | 增量 | 从 TiDB 同步到其他数据库 | 实时同步,支持多种下游 | 仅支持 TiDB 作为源数据库 |
| TiDB Binlog | TiDB | 增量 | 从 TiDB 同步到其他数据库 | 成熟稳定,支持多种下游 | 性能不如 TiCDC,配置复杂 |
| mysqldump | MySQL | 全量 | 小规模数据迁移 | 简单易用,无需额外工具 | 导入速度慢,不支持并行导入 |
| mydumper/myloader | MySQL | 全量 | 中等规模数据迁移 | 支持并行导入,速度较快 | 不支持增量同步 |
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-cluster3. 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 test4. 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 --version3. 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.toml4. 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.yaml3. 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.tomlQ3: 迁移过程中,源数据库可以继续写入吗?
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 加速分析查询
