更新时间:2023-06-14 GMT+08:00
如何将Mycat数据整库迁移至DDM
操作场景
本章节主要介绍将Mycat中的数据整库迁移到DDM中。
- 迁移过程中可能会出现业务中断情况,中断时长与迁移数据量大小、网络情况相关。
- 数据迁移是一项比较复杂的操作,建议在业务量较低时进行。本实践仅供参考,您需要根据自己业务场景、数据量、停机时间要求等情况,设计合适的迁移方案。
- 由于DDM仅支持通过弹性云服务器(ECS)访问,因此需要先将数据库导出为文件到ECS,然后从ECS将文件中的数据导入到DDM。
迁移前准备
- 准备可以访问Mycat、目标DDM实例和目标DDM实例关联的RDS实例的ECS。
- 确保Mycat、目标DDM实例和目标DDM实例关联的RDS实例都在同一个VPC下,保证网络互通。
- 部署Mycat的ECS、目标DDM实例和目标DDM实例关联的RDS实例的安全组建议配置相同,如果不同则需要放开对应端口访问。
- ECS已安装MySQL官方客户端,MySQL客户端版本建议为5.6或5.7。
- Redhat系列Linux安装命令:yum install mysql mysql-devel
- Debian系列Linux安装命令:apt install mysql-client-5.7 mysql-client-core-5.7
- ECS磁盘空间足够存放临时转储文件;ECS内存空间足够,可以用来比较转储文件。
- 准备已关联RDS实例的DDM实例,并配置DDM帐号、DDM逻辑库等相关信息。
- 本章节以Mycat 1.6版本进行迁移为例。
迁移策略
Mycat与DDM数据表类型不同,迁移策略也有所差异,详情如表1所示。
Mycat表类型 |
DDM表类型 |
迁移策略 |
---|---|---|
非拆分表 |
单表 |
|
拆分表:分片规则为hash类(含年月日等日期类) |
拆分表:拆分算法为hash(含日期函数) |
|
拆分表:分片规则为按范围range类(含年月日等日期类) |
拆分表:拆分算法为range(含日期函数) |
|
广播表 |
广播表 |
约束限制
- 为了保持数据完整性,需要先停止Mycat业务后再进行数据迁移。
- 该场景不支持通过DDM关联Mycat关联的RDS进行数据关联,需要将Mycat数据导出后再导入到DDM完成数据迁移。
- 目标DDM关联的RDS版本与Mycat关联数据库的版本需要保持一致。
从Mycat导出数据表结构
- 登录ECS。
- 执行如下命令导出Mycat数据中的表结构数据,其中斜体变量参数需根据实际情况配置,详细参数说明如表2所示。
mysqldump -h {DB_ADDRESS} -P {DB_PORT} -u {DB_USER} -p --skip-lock-tables --add-locks=false --set-gtid-purged=OFF --no-data --order-by-primary {DB_NAME} > {mysql_schema.sql} Enter password: **********
从Mycat整库导出数据
- 登录ECS。
- 执行如下命令导出Mycat整库数据,其中斜体变量参数需根据实际情况配置,详细参数说明如表2所示。
mysqldump -h {DB_ADDRESS} -P {DB_PORT} -u {DB_USER} -p --hex-blob --complete-insert --skip-lock-tables --add-locks=false --set-gtid-purged=OFF --quick --no-create-info --order-by-primary {DB_NAME} > {mysql_data.sql} Enter password: **********
- 导出完成后,在ECS上执行如下命令可查看导出的.sql文件。
ls -l
将数据导入至目标DDM(非拆分表场景)
在ECS上采用MySQL客户端直连目标DDM关联的RDS,直接执行以下命令导入表结构文本文件和数据文件。
如果是单表或普通表,
mysql -f -h {RDS_ADDRESS} -P {RDS_PORT} -u {RDS_USER} -p {DB_NAME} < {mysql_table_schema.sql} Enter password: ********** mysql -f -h {RDS_ADDRESS} -P {RDS_PORT} -u {RDS_USER} -p {DB_NAME} < {mysq_table_data.sql} Enter password: **********
- RDS_ADDRESS为待导入数据的RDS的地址。
- RDS_PORT为RDS实例的端口。
- RDS_USER为RDS实例的用户名。
- DB_NAME为RDS数据库名称,如果导入的是单表,DB_NAME为RDS第一个分片的物理数据库。
- mysql_table_schema.sql为待导入的表结构文件名。
- mysq_table_data.sql为待导入的表数据文件名。
将数据导入至目标DDM(拆分表、广播表场景)
在ECS上采用MySQL客户端连接DDM执行如下命令,将整库数据文件导入DDM。
mysql -f -h {DDM_ADDRESS} -P {DDM_PORT} -u {DDM_USER} -p {DB_NAME} < {mysql_data.sql} Enter password: **********
参数 |
说明 |
备注 |
---|---|---|
DDM_ADDRESS |
待导入数据的DDM实例连接地址。 |
可在DDM管理控制台上,实例基本信息页面查看“连接地址”和“端口”。 |
DDM_PORT |
待导入数据的DDM侦听端口。 |
|
DDM_USER |
访问DDM的用户。 |
创建DDM逻辑库时使用的帐号,需具备读写权限。 |
DB_NAME |
待导入数据的DDM逻辑库名称。 |
- |
mysql_data.sql |
待导入整库数据文件的名称。 |
即导出数据中2导出的文件名称。 |