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

3. [步骤二：表数据迁移]
4. [步骤三：表数据校验]
图1迁移Hologres场景图   
![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002112951833.png "点击放大")
#### 约束与限制
- 如果待迁移的表数量较多，建议分批次进行迁移。可以按业务分批，也可以按表的数据量分批。
- 如果在CDM迁移过程中有DELETE、UPDATE操作，无法保证迁移后的数据一致，需要重新迁移。
- 表的数据量太大，可以切片迁移。
- 整库迁移作业一次只能迁移一个数据库，如果迁移多个数据库需要配置多个迁移作业。
 
 #### 迁移前准备
- 已经购买了DWS和CDM集群，参见[CDM使用指南](https://support.huaweicloud.com/usermanual-cdm/cdm_01_0018.html)。
- 需确保源Hologres集群、目标DWS集群与CDM网络互通。本例DWS和CDM创建在同一个区域、同一个虚拟私有云和子网下。
- 迁移用户权限放通。
- 源端和目标端客户端安装完成。
- 已准备[表1]所列的迁移工具：DSC、DataCheck。
- DataCheck运行环境满足以下要求：
  - 服务器：Linux或Windows服务器，支持64位操作系统。
  
  - JRE或JDK：系统已安装JRE 1.8。
  
  - 网络环境：安装、运行DataCheck工具的服务器，需要与待连接的数据库的网络互通。
   
 
 表1迁移Hologres准备工具 
| 工具名       | 描述            | 工具获取                                                            |
|:---|:---|:---|
| DSC       | 配套DWS的语法迁移工具。 | [获取地址](https://support.huaweicloud.com/tg-dws/dws_07_0002.html) |
| DataCheck | 数据校验工具。       | 请联系技术支持工程师。                                                     |
   
 #### 步骤一：元数据迁移
1. 在Hologres中，使用以下SQL命令进行用户的角色和权限查询。 
   ```
   SELECT ROLNAME FROM pg_roles;
   SELECT user_display_name(ROLNAME) FROM pg_roles;
   ```
   
   
2. 在DWS中，集群创建成功后，默认情况下未开启三权分立，数据库系统管理员具有与对象所有者相同的权限。默认只有对象所有者或者系统管理员可以查询、修改和销毁对象。根据Hologres中查询出的角色和权限，相应在DWS中创建对应的角色和权限，并通过以下途径授权用户权限。 
   - 使用GRANT将对象的权限授予其他用户。
     ```
     GRANT USAGE ON SCHEMA schema TO user;
     GRANT SELECT ON TABLE schema.table To user;
     ```
     
   
   - 使用户继承角色所拥有的对象权限。
     ```
     CREATE ROLE role_name WITH CREATEDB PASSWORD '*******';
     GRANT role_name to user;
     ```
     
   
   
   
   
3. 导出源语法。源语法是客户业务的实现逻辑，从Hologres中导出源语法，再修改为适用于DWS的语法，可以减少建模的工作量，提升业务迁移的效率。 
   执行以下SQL进行全量语法导出。
   ```
   SELECT hg_dump_script('schema_name.table_name');
   ```
   ![](https://support.huaweicloud.com/bestpractice-dws/public_sys-resources/note_3.0-zh-cn.png)
   - 由于源语法涉及业务范围的识别，需熟悉业务的DBA进行操作，建议源语法由客户DBA提供。
   
   - 如果进行批量导出，可以使用UNION ALL将所有待查询表关联，语法格式如下：
     ```
     SELECT hg_dump_script('schema_name.table_name')
     UNION ALL
     SELECT hg_dump_script('schema_name.table_name')
     …
     ```
     
   
   - 如果执行失败，需要使用如下命令在DB中创建extension，然后再执行上述SQL。
     ```
     CREATE EXTENSION hg_toolkit;
     ```
     
    
   
   
   
4. 连接DWS，执行以下SQL创建数据库，推荐使用MySQL兼容模式建库。 
   ```
   CREATE DATABASE tldg WITH ENCODING 'UTF-8' TEMPLATE template0 DBCOMPATIBILITY 'MYSQL';
   ```
   
   
5. 使用DSC工具对DDL语法进行转换。 
   1. 解压[迁移前准备]获取到的DSC工具包。
   
   2. 将待转换的DDL语法文件放入DSC的input文件夹中。
      图2input目录   
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002112906849.png "点击放大") 
   
   3. 打开命令行工具，Windows环境下双击runDSC.bat。（Linux环境下运行runDSC.sh。）
   
   4. 执行以下命令进行语法转换。
      ```
      runDSC.bat -S Hologres
      ```
      图3DDL语法转换   
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002077427480.png "点击放大") 
   
   5. 可以在output文件夹下查看转换结果。
      图4DDL转换结果   
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002077272736.png "点击放大") 
   
   6. 连接DWS，执行上一步转换完成的DDL语句，完成建表。
   
   
   ![](https://support.huaweicloud.com/bestpractice-dws/public_sys-resources/note_3.0-zh-cn.png)
   DSC更多内容请参见[DSC工具使用指导](https://support.huaweicloud.com/tg-dws/dws_mt_index.html)。
   
   
 
 #### 步骤二：表数据迁移
CDM支持[表级迁移]和[库级迁移]，可根据实际迁移场景进行选择。
1. 配置CDM的源端连接。由于Hologres的建表语法兼容PostgreSQL，所以配置CDM的连接选择PostgreSQL数据源即可。 
   1. 登录[CDM管理控制台](https://console.huaweicloud.com/cdm#/cdm/clusterList)，单击左侧"集群管理"。
   
   2. 如果CDM与源端Hologres通过公网连接，需要绑定公网IP，参见[绑定EIP](https://support.huaweicloud.com/usermanual-cdm/cdm_01_0085.html)。
   
   3. 单击集群名称右边的"作业管理"，进入迁移作业界面。
      图5CDM集群管理页面   
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002191141686.png "点击放大")
      
      
   
   4. 首次建立作业连接前，需要安装驱动。选择"连接管理 \> 驱动管理"，[安装PostgreSQL驱动](https://support.huaweicloud.com/usermanual-cdm/cdm_01_0215.html)。
   
   5. 驱动安装完成后，在连接管理页面单击"新建连接"，选择"PostgreSQL"，单击"下一步"。
   
   6. 填写Hologres数据库信息。
      图6Hologres连接信息   
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002112580181.png "点击放大")
      
      
   
   7. 单击"测试"，测试连通后，单击"保存"。
   
   
   
   
2. 配置CDM的目标端连接。 
   1. 参见同样方法，选择"作业管理 \> 连接管理 \> 新建连接"。
   
   2. 选择"数据仓库服务（DWS）"，单击"下一步"。
   
   3. 同理，填写DWS的数据库信息。
      图7DWS连接信息   
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002077065326.png "点击放大")
      
      
   
   4. 单击"测试"，测试连通后，单击"保存"。
   
   
   
   
3. 配置并启动**表级迁移** 作业。
   
   1. 单击"表/文件迁移"标签。该标签下创建的作业为单表数据迁移。
   
   2. 填写源端和目标端信息。
      图8表级迁移作业配置   
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002076937672.png "点击放大") 
   
   3. 单击"下一步"，进行字段映射。
      图9表级迁移表字段映射   
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002077181724.png "点击放大")
      
      
   
   4. 确认无误后单击"下一步"。
   
   5. 在任务配置页面，"抽取并发数"表示单并发抽取数据，默认为1，可以适当调大取值，建议不要超过4，确认无误后，单击"保存并运行"。
      图10表级迁移任务配置   
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002112906853.png "点击放大")
      迁移作业开始执行，可以在作业任务栏中查看运行状态，等待作业迁移成功。
      图11作业运行状态   
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002077427484.png "点击放大")
      
      
   
   
   
   
4. 配置并启动**库级迁移** 作业。
   
   1. 单击"整库迁移"页签，单击"新建作业"。
   
   2. 按照提示输入各项，左侧是源端信息，右侧为目标端信息。填写完毕后单击"下一步"。
      图12库级迁移作业配置   
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002077272740.png "点击放大") 
   
   3. 勾选所有表或需迁移数据的表，单击中间右箭头转移到右侧，无误后单击"下一步"。
      图13选择迁移的表   
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002112951845.png "点击放大") 
   
   4. 填写作业配置参数。
      - 同时执行的子作业个数：表示同时同步数据的表个数，默认为10，建议调到5以下。
      
      - 抽取并发数：表示单并发抽取数据，默认为1，可以适当调大，建议不要超过4。
      
      
      核对无误后单击"保存并运行"。
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002112906857.png "点击放大")
      
   
   5. 等待作业迁移完成。单击作业名称，可以看到各表的迁移完成情况。
      图14库级迁移作业列表   
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002077427492.png "点击放大")
      图15各表数据迁移情况   
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002077214290.png "点击放大") 
   
   
   
   
 
 #### 步骤三：表数据校验
迁移完成之后，可使用数据校验工具DataCheck校验源端、目标端的数据是否一致。
1. 下载软件包后，解压DataCheck-\*.zip包，进入DataCheck-\*目录，即可使用。目录下各文件的使用说明参见[表2]。
2. 配置工具包。 
   - **Windows环境下** ：
     打开conf文件夹中的dbinfo.properties文件，根据实际需要进行配置。Holo源的配置参考下图：
     图16配置DataCheck   
     ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002077272748.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_0000002112951849.png "点击放大")
     运行成功后会在本地bin目录下生成加密文件，如下图。
     ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002191388966.png "点击放大")
     
   
   - **Linux环境下** ：
     其他步骤相同。密文生成方法与上文中Window环境下的方法类似，命令为**sh encryption.sh** *\[password\]*。
     ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002077427504.png "点击放大")
     
   
   
   
   
3. 执行数据校验。 
   **Windows环境下**：
   1. 打开check.input文件，将要校验的Schema、数据库、源表、目标端表填入，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 mode支持statistics，即统计值校验。
       
      下图为元数据对比的check_input文件。
      图17check_input   
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002077269880.png "点击放大") 
   
   2. 在bin目录下使用命令datacheck.bat执行校验工具： ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002077272764.png "点击放大")
      
   
   3. 查看已生成的校验结果 check_input_result.xlsx： 下图为源端元数据与目标端一致的结果。
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002112951869.png "点击放大")
      下图为源端元数据与目标端不一致的结果。
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002112906873.png "点击放大")
      统计值校验参考下图。
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002077427512.png "点击放大")
      
   
   
   **Linux环境下**：
   1. 编辑check_input.xlsx文件并上传，参考Window环境下的第一步。
   
   2. 使用命令**sh datacheck.sh** 执行校验工具。
      ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002077272776.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，读出数据并校验内容是否相同。   |
   
