TiDB数据库使用Dumpling + Lightning 的方式迁移数据
核心思想:物理导入 vs 逻辑导入
-
逻辑导入(如 mysql 客户端):执行 SQL 语句(INSERT),速度慢,兼容性问题多
-
物理导入(Dumpling+Lightning):直接导入数据文件,速度快,兼容性好
架构概述
|
1 2 3 4 5 6 7 |
MySQL Source │ ▼ (使用 Dumpling 导出) Dumpled Data Files (.sql, .csv + metadata) │ ▼ (使用 Lightning 导入) TiDB Cluster |
第 1 步:使用 Dumpling 导出数据
Dumpling 的作用
-
从 MySQL 并行导出数据和表结构
-
生成 Lightning 所需的元数据文件
-
支持断点续传和压缩
安装 Dumpling
|
1 |
tiup install dumpling |
常用导出命令
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# 基本导出命令 tiup dumpling -h 192.168.1.100 -P 3306 -u root -p 'mysql密码' \ -o /home/TiDB/water-tidb/backup/ \ -F 256MB \ # 每个文件最大256MB --threads 16 \ # 并发线程数 --compress "gzip" \ # 压缩输出 --filetype sql # 输出格式 # 导出指定数据库 tiup dumpling -h 192.168.2.100 -P 3306 -u root -p '密码' -o /home/TiDB/water-tidb/backup/ -B water --filetype sql --threads 16 # 导出指定表 tiup dumpling -h 192.168.1.100 -P 3306 -u root -p 'mysql密码' \ -o /home/TiDB/water-tidb/backup/ \ -B my_database \ # 数据库名 -T table1,table2 \ # 表名 -F 256MB \ --threads 16 |
导出后的文件结构
|
1 2 3 4 5 6 7 |
/data/backup/ ├── metadata # 元数据文件 ├── my_database.table1-schema.sql # 表结构 ├── my_database.table1.000000000.sql # 数据文件 ├── my_database.table1.000000001.sql ├── my_database.table2-schema.sql └── my_database.table2.000000000.sql |
第 2 步:使用 Lightning 导入数据
Lightning 的作用
-
将 Dumpling 导出的数据快速导入 TiDB
-
支持并行导入,速度极快
-
自动处理数据转换和兼容性问题
安装 Lightning
|
1 |
tiup install tidb-lightning |
创建 Lightning 配置文件
创建water- lightning.toml:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
[lightning] # 通用配置 level = "info" file = "tidb-lightning.log" check-requirements = true [tikv-importer] # 导入模式:local 模式最快 backend = "local" # 排序数据的临时目录 sorted-kv-dir = "/tmp/sorted-kv-dir" [mydumper] # Dumpling 导出的数据目录 data-source-dir = "/home/TiDB/water-tidb/backup/" # 文件大小限制 batch-size = 1000 max-region-size = 268435456 [tidb] # 目标 TiDB 集群信息 host = "127.0.0.1" port = 4000 user = "root" password = "数据库密码" status-port = 10080 # TiDB 状态端口 pd-addr = "127.0.0.1:2379" # PD 地址 [checkpoint] # 断点续传配置 enable = true driver = "file" dsn = "/tmp/lightning-checkpoint" [post-restore] # 导入后操作 level-1-compact = false compact = false |
运行 Lightning 导入
|
1 |
tiup tidb-lightning -config water-lightning.toml |
详细工作流程
Dumpling 导出阶段
-
连接 MySQL:建立到源数据库的连接
-
导出表结构:生成 CREATE TABLE 语句
-
并行导出数据:多线程导出表数据
-
生成元数据:记录导出时的一致性点
Lightning 导入阶段
-
解析数据:读取 Dumpling 导出的文件
-
数据转换:将 SQL 数据转换为 TiKV 的键值对格式
-
数据排序:在本地对数据进行排序
-
切分 Region:根据数据分布切分导入范围
-
并行导入:多线程向 TiKV 导入数据
-
校验数据:验证导入数据的完整性
性能优化参数
Dumpling 优化
|
1 2 3 4 5 6 7 8 |
tiup dumpling -h 192.168.1.100 -u root -p 'password' \ -o /data/backup/ \ -F 512MB \ # 增大文件大小 --threads 32 \ # 增加并发线程 --rows 1000000 \ # 每文件行数限制 --compress "gzip" \ # 压缩节省空间 --where "id>1000" \ # 条件导出 --escape-backslash # 处理特殊字符 |
Lightning 优化
|
1 2 3 4 5 6 7 8 9 |
[lightning] # 性能调优 region-concurrency = 32 # 并发数,建议等于CPU核心数 table-concurrency = 16 # 表级别并发 index-concurrency = 16 # 索引并发 [mydumper] batch-size = 10000 # 批处理大小 max-region-size = 512 * 1024 * 1024 # Region大小 |
错误处理和监控
查看导入状态
|
1 2 3 4 5 |
# 查看 Lightning 日志 tail -f tidb-lightning.log # 查看进度 grep "progress" tidb-lightning.log |
断点续传
Lightning 支持断点续传,如果导入中断,可以重新运行相同的命令继续导入。
验证导入结果
|
1 2 3 4 5 |
-- 检查导入的数据量 SELECT COUNT(*) FROM imported_table; - 检查是否有错误 ADMIN CHECK TABLE imported_table; |