# 使用CDM迁移AnalyticDB for MySQL至DWS集群
本实践演示如何使用云数据迁移服务CDM将AnalyticDB for MySQL（后面简称ADB）数据迁移到DWS。
云数据迁移（Cloud Data Migration，简称CDM），是一种高效、易用的批量数据迁移服务。了解更多请参见[云数据迁移CDM](https://support.huaweicloud.com/cdm/index.html)。
本实践预计时长90分钟，实践用到的云服务包括**虚拟私有云 VPC及子网** 、**弹性公网EIP、** **云数据迁移 CDM** 和**数据仓库服务 DWS，**基本流程如下：
1. [迁移前准备]
2. [步骤一：元数据迁移]

3. [步骤二：表数据迁移]
4. [步骤三：数据一致性校验]
图1AnalyticDB for MySQL迁移场景   
![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002078089696.png "点击放大")
#### 约束与限制
- 如果在CDM迁移过程中有DELETE、UPDATE操作，无法保证迁移后的数据一致，需要重新迁移。
- 整库迁移作业一次只能迁移一个数据库，如果迁移多个数据库需要配置多个迁移作业。
- 在目标端DWS需要创建待同步的数据库和schema。
- ADB的库层级对应的是DWS的schema层级。
 
 #### 迁移前准备
- 已经购买了DWS和CDM集群，参见[CDM使用指南](https://support.huaweicloud.com/usermanual-cdm/cdm_01_0018.html)。
 
- 需确保源ADB集群、目标DWS集群与CDM网络互通。本例DWS和CDM创建在同一个区域、同一个虚拟私有云和子网下。
- 迁移用户权限放通。
- 源端和目标端客户端安装完成。
- 在源端ADB集群配置"数据安全-白名单设置"，添加CDM集群的IP信息。
- 已准备[表1]所列的迁移工具：DSC、DataCheck。

- DataCheck运行环境满足以下要求：
  - 服务器：Linux或Windows服务器，支持64位操作系统。
  
  - JRE或JDK：系统已安装JRE 1.8。
  
  - 网络环境：安装、运行DataCheck工具的服务器，需要与待连接的数据库的网络互通。
   
 表1迁移ADB准备工具 
| 工具名       | 描述            | 工具获取                                                            |
|:---|:---|:---|
| DSC       | 配套DWS的语法迁移工具。 | [获取地址](https://support.huaweicloud.com/tg-dws/dws_07_0002.html) |
| DataCheck | 数据校验工具。       | 请联系技术支持工程师。                                                     |
   
 #### 步骤一：元数据迁移
1. 导出源语法。源语法是客户业务的实现逻辑，从ADB导出源语法，再修改为适用于DWS的语法，可以减少建模的工作量，提升业务迁移的效率。 
   **导出方法**：在ADB控制台操作，登录数据库后，选择对应数据库，选择"导出 \> 整库建表语句"，保存DDL_migration.sql即可。
   ![](https://support.huaweicloud.com/bestpractice-dws/public_sys-resources/note_3.0-zh-cn.png)
   由于源语法涉及业务范围的识别，需熟悉业务的DBA进行操作，建议源语法由客户DBA提供。
   
   
2. 使用DSC工具对DDL语法进行转换。
   
   1. 解压[迁移前准备]获取到的DSC工具包。
   
   2. 将待转换的DDL语法文件放入DSC的input文件夹中。
      图2input目录   
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002116290145.png "点击放大") 
   
   3. 打开命令行工具，Windows环境下双击runDSC.bat。（Linux环境下运行runDSC.sh。）
   
   4. 执行以下命令进行语法转换。
      ```
      runDSC.bat -S mysql
      ```
      图3DDL转换   
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002113716865.png "点击放大") 
   
   5. 可以在output文件夹下查看转换结果。
      图4DDL转换结果   
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002116375241.png "点击放大") 
   
   
   
   
3. 连接DWS，执行以下SQL语句创建目标数据库，本例为migration。 
   ```
   CREATE DATABASE database_name WITH ENCODING 'UTF-8' DBCOMPATIBILITY 'mysql' TEMPLATE template0;
   ```
   
   
4. ADB中的数据库的概念相当于DWS的Schema的概念，因此目的端DWS需要在新创建的数据库中创建对应的Schema。 
   先切换到新创建的数据库，再执行以下SQL语句创建Schema。
   ```
   CREATE SCHEMA schema_name;
   ```
   
   
5. 在DWS的SQL编辑器窗口，选择已创建的数据库和Schema，单击"导入"，导入[2]转换完成的建表语句。
   
   图5导入DDL语句   
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002078711228.png "点击放大")
   
   
6. 导入完成后，单击"运行"，执行SQL语句完成建表。
7. 查看表是否创建成功。 
   ```
   SELECT table_name FROM information_schema.tables WHERE table_schema = 'migration';
   ```
   
   
 
 #### 步骤二：表数据迁移
1. 配置CDM的源端连接。 
   1. 登录[CDM管理控制台](https://console.huaweicloud.com/cdm)，单击左侧"集群管理"。
   
   2. 如果CDM与源端ADB通过公网连接，需要绑定公网IP，参见[绑定EIP](https://support.huaweicloud.com/usermanual-cdm/cdm_01_0085.html)。
   
   3. 单击集群名称右边的"作业管理"，进入迁移作业界面。
   
   4. 首次建立作业连接前，需要安装驱动。选择"连接管理 \> 驱动管理"，[安装MySQL驱动](https://support.huaweicloud.com/usermanual-cdm/cdm_01_0215.html)。
   
   5. 驱动安装完成后，在连接管理页面单击"新建连接"，选择"MySQL"，单击"下一步"。
   
   6. 填写ADB数据库信息。
      图6ADB信息   
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002080090816.png "点击放大") 
   
   7. 单击"测试"，测试连通后，单击"保存"。
   
   
   
   
2. 配置CDM的目标端连接。 
   1. 参见同样方法，选择"作业管理 \> 连接管理 \> 新建连接"。
   
   2. 选择"数据仓库服务（DWS）"，单击"下一步"。
   
   3. 同理，填写DWS的数据库信息。
      图7DWS信息   
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002080096562.png "点击放大") 
   
   4. 单击"测试"，测试连通后，单击"保存"。
   
   
   
   
3. 配置并启动**表级迁移** 作业。
   
   1. 单击"表/文件迁移"标签。该标签下创建的作业为单表数据迁移。
   
   2. 填写源端和目标端信息。
      图8表级作业迁移   
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002080308356.png "点击放大")
      - 作业名称：用户自定义便于记忆、区分的任务名称。
      
      - 源端作业配置
        - 源连接名称：选择已创建MySQL源端连接。
        
        - 使用SQL语句：否。
        
        - 模式或表空间：待抽取数据的模式或表空间名称。
        
        - 表名：要抽取的表名。
        
        - 其他可选参数一般情况下保持默认即可。
         
      
      - 目的端作业配置
        - 目的连接名称：选择已创建的DWS目标端连接。
        
        - 模式或表空间：选择待写入数据的DWS数据库。
        
        - 自动创表：只有当源端和目的端都为关系数据库时，才有该参数。
        
        - 表名：待写入数据的表名，可以手动输入一个不存在表名，CDM会在DWS中自动创建该表。
        
        - 导入前清空数据：任务启动前，是否清除目的表中数据，用户可根据实际需要选择。
         
       
   
   3. 单击"下一步"，进行字段映射。
      图9表级迁移表字段映射   
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002115824145.png "点击放大")
      - 如果字段映射顺序不匹配，可通过拖拽字段调整。
      
      - CDM的表达式已经预置常用字符串、日期、数值等类型的字段内容转换，详细请参见[++字段转换++](https://support.huaweicloud.com/bestpractice-dataartsstudio/dataartsstudio_05_0012.html)。
        
   
   4. 确认无误后单击"下一步"。
   
   5. 在任务配置页面，填写以下参数。
      - 作业失败重试：如果作业执行失败，可选择是否自动重试，这里保持默认值"不重试"。
      
      - 作业分组：选择作业所属的分组，默认分组为"DEFAULT"。在CDM"作业管理"界面，支持作业分组显示、按组批量启动作业、按分组导出作业等操作。
      
      - 是否定时执行：如果需要配置作业定时自动执行，可打开此配置。这里保持默认值"否"。
      
      - 抽取并发数：表示单并发抽取数据，默认为1，可以适当调大取值，建议不要超过4。
      
      - 是否写入脏数据：表到表的迁移容易出现脏数据，建议配置脏数据归档。
      
      
      图10表级迁移任务配置   
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002080736266.png "点击放大") 
   
   6. 确认无误后，单击"保存并运行"。 迁移作业开始执行，可以在作业任务栏中查看运行状态，等待作业迁移成功。
      图11表级迁移成功   
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002080668134.png "点击放大") 
   
   
   
   
4. 配置并启动**库级迁移** 作业。
   
   1. 单击"整库迁移"页签，单击"新建作业"。
   
   2. 按照提示输入各项，左侧是源端信息，右侧为目标端信息。
      - 作业名称：用户自定义便于记忆、区分的任务名称。
      
      - 源端作业配置
        - 源连接名称：选择已创建的MySQL源端连接。
        
        - 使用SQL语句：否。
        
        - 模式或表空间：待抽取数据的模式或表空间名称。
        
        - 表名：要抽取的表名。
        
        - 其他可选参数一般情况下保持默认即可。
         
      
      - 目的端作业配置
        - 目的连接名称：选择已创建的DWS目标端连接。
        
        - 模式或表空间：选择待写入数据的DWS数据库。
        
        - 自动创表：只有当源端和目的端都为关系数据库时，才有该参数。
        
        - 导入前清空数据：任务启动前，是否清除目的表中数据，用户可根据实际需要选择。
         
      
      
      图12库级迁移作业配置   
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002116290273.png "点击放大") 
   
   3. 填写完毕后单击"下一步"。
   
   4. 勾选所有表或需迁移数据的表，单击中间右箭头转移到右侧，无误后单击"下一步"。
      图13选择迁移的表   
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002116267421.png "点击放大") 
   
   5. 填写作业配置参数。
      - 同时执行的子作业个数：表示同时同步数据的表个数，默认为10，建议调到5以下。
      
      - 抽取并发数：表示单并发抽取数据，默认为1，可以适当调大，建议不要超过4。
      
      
      核对无误后单击"保存并运行"。
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002116375313.png "点击放大")
      
   
   6. 等待作业迁移完成。单击作业名称，可以看到各表的迁移完成情况。
      图14各表数据迁移情况   
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002116353913.png "点击放大") 
   
   
   
   
5. 连接DWS，执行以下SQL查看数据是否迁移成功。 
   ```
   SELECT 'migration.users',count(1) FROM migration.users UNION ALL
   SELECT 'migration.products',count(1) FROM migration.products UNION ALL
   SELECT 'migration.orders',count(1) FROM migration.orders UNION ALL
   SELECT 'migration.employees',count(1) FROM migration.employees;
   ```
   
   
 
 #### 步骤三：数据一致性校验
迁移完成之后，可使用数据校验工具DataCheck校验源端、目标端的数据是否一致。
1. 下载软件包后，解压DataCheck-\*.zip包，进入DataCheck-\*目录，即可使用。目录下各文件的使用说明参见[表2]。
2. 配置工具包。 
   - **Windows环境下** ：
     打开conf文件夹中的dbinfo.properties文件，根据实际需要进行配置。ADB源的配置参考下图：
     图15配置DataCheck   
     ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002080721192.png "点击放大")
     ![](https://support.huaweicloud.com/bestpractice-dws/public_sys-resources/note_3.0-zh-cn.png)
     文件中的密码src.passwd和dws.passwd可使用工具，执行以下命令生成密文。
     **encryption.bat** *password*
     ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002080731008.png "点击放大")
     运行成功后会在本地bin目录下生成加密文件，如下图。
     ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002227295985.png "点击放大")
     
   
   - **Linux环境下** ：
     其他步骤相同。密文生成方法与上文中Windows环境下的方法类似，命令为**sh encryption.sh** *\[password\]*。
     ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002116290277.png "点击放大")
     
   
   
   
   
3. 执行数据校验。 
   **Windows环境下**：
   1. 打开check.input文件，将要校验的数据库(不填默认使用conf配置文件内的内容)、源表、目标端表填入，Row Range可根据需要填写特定范围的数据查询语句。
      ![](https://support.huaweicloud.com/bestpractice-dws/public_sys-resources/note_3.0-zh-cn.png)
      - 源端的库名在配置文件中配置后，check.input文件中的源端会默认填写配置文件中的库名，若check.input文件中填入其他库名，以check.input文件中的优先级为高。
      
      - 校验级别Check Strategy支持high、middle、low三种，若未填写，默认为low。
       
      下图为元数据对比的check_input文件。
      图16check_input   
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002080570648.png "点击放大") 
   
   2. 在bin目录下使用命令datacheck.bat执行校验工具： ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002116370261.png "点击放大")
      
   
   3. 查看已生成的校验结果 check_input_result.xlsx。 下图为源端元数据与目标端一致的结果。
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002116285385.png "点击放大")
      下图为源端元数据与目标端不一致的结果。
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002080571624.png "点击放大")
      
   
   
   **Linux环境下**：
   1. 编辑check_input.xlsx文件并上传，参考Windows环境下的第一步。
   
   2. 使用命令**sh datacheck.sh** 执行校验工具。
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002116375317.png "点击放大")
      
   
   3. 查看校验结果check_input_result.xlsx（校验结果分析与Windows场景相同）。
   
   
   
   
 
#### 参考信息
 表2DataCheck目录说明 
| **文件或文件夹**                                                                                                  || **说明**                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
|:---|---|:---|
| DataCheck | bin                     | 保存校验工具入口脚本。 - Windows版本：datacheck.bat  - Linux版本：datacheck.sh   |
| DataCheck | conf                    | 配置文件，进行源数据库和目的数据库的连接配置和日志打印设置。                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| DataCheck | lib                     | 保存校验工具运行所需的相关jar包。                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| DataCheck | check_input.xlsx        | - 待校验的表信息，包括Schema名、表名、列名等。  - 记录用户的校验级别信息和校验规则。已支持3种级别校验，包括high、middle、low，默认为low。                                                   |
| DataCheck | logs                    | 压缩包中不包含该文件，校验工具执行后自动生成，记录工具运行过程日志。                                                                                                                                                                                                                                                                                                                                                                                                                                |
| DataCheck | check_input_result.xlsx | 压缩包中不包含该文件，执行校验工具后会在check_input.xlsx相同路径下生成校验结果文件。                                                                                                                                                                                                                                                                                                                                                                                                                |
   
表3数据校验工具基本功能介绍 
| DataCheck工具介绍                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
|:---|
| - 支持DWS，MySQL，PostgreSQL数据库的数据校验。  - 支持通用类型字段校验：数值、时间、字符类型。  - 支持校验级别设置：包括high、middle、low三种。  - 支持指定schema、表名、列名进行校验。  - 支持指定记录的校验范围，默认为校验所有记录。  - 校验方式涉及count(\*)、max、min、sum、avg以及抽样明细校验等方式。  - 输出校验结果和相关校验明细说明。   |
   
表4数据校验级别说明 
| 校验级别 | 校验说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | 校验相关语法                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
|:---|:---|:---|
| 低    | - 数据数量校验                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | - 条数校验: COUNT(\*)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| 中    | - 数据数量校验  - 数值类型校验                                                                                                                                                                                                                                                                                                                               | - 条数校验: COUNT(\*)  - 数值校验: MAX, MIN, SUM, AVG                                                                                                                                                                                                                                                                                                                                                                        |
| 高    | - 数据数量校验  - 数值类型校验  - 日期类型校验  - 字符类型校验   | - 条数校验: COUNT(\*)  - 数值校验: MAX, MIN, SUM, AVG  - 日期校验: MAX, MIN  - 字符校验：order by limit 1000，读出数据并校验内容是否相同。   |
   
