
# 如何将Mycat数据整库迁移至DDM
#### 操作场景
本章节主要介绍将Mycat中的数据整库迁移到DDM中。
![](https://support.huaweicloud.com/bestpractice-ddm/public_sys-resources/note_3.0-zh-cn.png)
- 迁移过程中可能会出现业务中断情况，中断时长与迁移数据量大小、网络情况相关。
- 数据迁移是一项比较复杂的操作，建议在业务量较低时进行。本实践仅供参考，您需要根据自己业务场景、数据量、停机时间要求等情况，设计合适的迁移方案。
- 由于DDM仅支持通过弹性云服务器（ECS）访问，因此需要先将数据库导出为文件到ECS，然后从ECS将文件中的数据导入到DDM。
 
#### 迁移前准备
- 准备可以访问Mycat、目标DDM实例和目标DDM实例关联的RDS实例的ECS。
  1. 确保Mycat、目标DDM实例和目标DDM实例关联的RDS实例都在同一个VPC下，保证网络互通。
  
  2. 部署Mycat的ECS、目标DDM实例和目标DDM实例关联的RDS实例的安全组建议配置相同，如果不同则需要放开对应端口访问。
  
  3. ECS已安装MySQL官方客户端，MySQL客户端版本建议为5.6或5.7。
     - Red Hat系列Linux安装命令：**yum install mysql mysql-devel**
     
     - Debian系列Linux安装命令：**apt install mysql-client-5.7 mysql-client-core-5.7**
      
  
  
  
  4. ECS磁盘空间足够存放临时转储文件；ECS内存空间足够，可以用来比较转储文件。
   

- 准备已关联RDS实例的DDM实例，并配置DDM账号、DDM逻辑库等相关信息。
- 本章节以Mycat 1.6版本进行迁移为例。
 
#### 迁移策略
Mycat与DDM数据表类型不同，迁移策略也有所差异，详情如[表1]所示。
 表1迁移策略 
| Mycat表类型                     | DDM表类型                | 迁移策略                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
|:---|:---|:---|
| 非拆分表                         | 单表                    | 1. Mycat导出[表结构]和[表数据]。  2. 连接目标DDM关联的RDS[将数据导入至目标DDM（非拆分表场景）]。                                                                                                                           |
| 拆分表：分片规则为hash类（含年月日等日期类）     | 拆分表：拆分算法为hash（含日期函数）  | 1. Mycat导出全部数据表结构。  2. 对照导出的表结构，在DDM控制台创建表结构完全相同的表。  3. [从Mycat整库导出数据]。  4. [连接DDM导入整库数据]。   |
| 拆分表：分片规则为按范围range类（含年月日等日期类） | 拆分表：拆分算法为range（含日期函数） | 1. Mycat导出全部数据表结构。  2. 对照导出的表结构，在DDM控制台创建表结构完全相同的表。  3. [从Mycat整库导出数据]。  4. [连接DDM导入整库数据]。   |
| 广播表                          | 广播表                   | 1. Mycat导出全部数据表结构。  2. 对照导出的表结构，在DDM控制台创建表结构完全相同的表。  3. [从Mycat整库导出数据]。  4. [连接DDM导入整库数据]。   |
   
#### 约束限制
- 为了保持数据完整性，需要先停止Mycat业务后再进行数据迁移。
- 该场景不支持通过DDM关联Mycat关联的RDS进行数据关联，需要将Mycat数据导出后再导入到DDM完成数据迁移。
- 目标DDM关联的RDS版本与Mycat关联数据库的版本需要保持一致。
 
 #### 从Mycat导出数据表结构
1. 登录ECS。
2. 执行如下命令导出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: **********
   ```
    表2参数解释 
   | 参数               | 说明             | 备注                                                                                                |
   |:---|:---|:---|
   | DB_ADDRESS       | 待导出数据的数据库连接地址。 | 必填                                                                                                |
   | DB_PORT          | 数据库侦听端口        | 必填                                                                                                |
   | DB_USER          | 数据库用户          | 必填                                                                                                |
   | DB_NAME          | 数据库名称          | 必填                                                                                                |
   | mysql_schema.sql | 生成的表结构文件名。     | 每次导出表结构时文件名不同。 建议以"逻辑库名"+"_"+"schema"格式命名，以免数据被覆盖。如mysql_schema.sql。 |
   | mysql_data.sql   | 生成的整库数据文件名。    | -                                                                                                 |
      
   
   
 
 #### 从Mycat整库导出数据
1. 登录ECS。
2. 执行如下命令导出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: **********
   ```
   
   
3. 导出完成后，在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: **********
```
表3参数解释 
| 参数             | 说明               | 备注                                               |
|:---|:---|:---|
| DDM_ADDRESS    | 待导入数据的DDM实例连接地址。 | 可在DDM管理控制台上，实例基本信息页面查看"连接地址"和"端口"。               |
| DDM_PORT       | 待导入数据的DDM侦听端口。   | 可在DDM管理控制台上，实例基本信息页面查看"连接地址"和"端口"。               |
| DDM_USER       | 访问DDM的用户。        | 创建DDM逻辑库时使用的账号，需具备读写权限。                          |
| DB_NAME        | 待导入数据的DDM逻辑库名称。  | -                                                |
| mysql_data.sql | 待导入整库数据文件的名称。    | 即导出数据中[2]导出的文件名称。 |
   
