如果分表数据总规模特别大(例如大于 1 TiB),并且允许 TiDB 集群在迁移期间无其他业务写入,那么你可以使用 TiDB Lightning 对分表数据进行快速合并导入,然后根据业务需要选择是否使用 TiDB DM 进行增量数据的分表同步。本文所称“大数据量”通常指 TiB 级别以上。本文档举例介绍了导入数据的操作步骤。
如果分库分表合并迁移在 1 TiB 以内,请参考从小数据量分库分表 MySQL 合并迁移数据到 TiDB,支持全量和增量且更为简单。
使用 TiDB Lightning 快速合并导入的原理如下图所示。
在这个示例中,假设有两个数据库 my_db1 和 my_db2 ,使用 Dumpling 分别从 my_db1 中导出 table1 和 table2 两个表,从 my_db2 中导出 table3 和 table4 两个表,然后再用 TiDB Lightning 把导出的 4 个表合并导入到下游 TiDB 中的同一个库 my_db 的同一个表格 table5 中。
本文将以三个步骤演示导入流程:
- 使用 Dumpling 导出全量数据备份。在本文档示例中,分别从 2 个源数据库中各导出 2 个表:
- 从 实例 1 MySQL 的 my_db1 导出 table1、table2
- 从 实例 2 MySQL 的 my_db2 导出 table3、table4
- 启动 Lightning 执行导入 TiDB 中的 mydb.table5
- 使用 DM 进行增量数据迁移(可选)
前提条件
- 使用 TiUP 安装 DM 集群
- 使用 TiUP 安装 Dumpling 和 Lightning
- Dumpling 所需上游数据库权限
- TiDB Lightning 所需下游数据库权限
- TiDB Lightning 下游数据库所需空间
- DM 所需上下游数据库权限
分表数据冲突检查
迁移中如果涉及合库合表,来自多张分表的数据可能引发主键或唯一索引的数据冲突。因此在迁移之前,需要检查各分表数据的业务特点。详情请参考跨分表数据在主键或唯一索引冲突处理,这里做简要描述:
假设 table1~4 具有相同的表结构如下:
CREATE TABLE `table1` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `sid` bigint(20) NOT NULL, `pid` bigint(20) NOT NULL, `comment` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `sid` (`sid`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1
其中id
列为主键,具有自增属性,多个分表范围重复会引发数据冲突。sid
列为分片键,可以保证全局满足唯一索引。因此可以移除下游table5
表id
列的唯一键属性