
# 导出表定义、语法转换迁移
1. 使用拥有sysdba权限的账户（本例使用**db_user01** ）登录PL/SQL Developer。
   
   ![](https://support.huaweicloud.com/bestpractice-dws/public_sys-resources/note_3.0-zh-cn.png)
   以下以试用版的PL/SQL Developer的界面为例，实际请以新界面为准。
   
   

2. 在菜单栏选择"工具 \> 导出用户对象..."。
3. 选择当前登录用户**db_user01** ，然后选择该用户下的表对象**APEX2_DYNAMIC_ADD_REMAIN_TEST** ，不选择包括存储，并选择语法导出文件的路径（导出的sql文件命名为test），单击"导出"。
   
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000001401029212.png "点击放大")
   导出的DDL文件如下显示。
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000001401735432.png "点击放大")
   
   
4. 将导出的DDL文件放在解压后的DSC文件夹的input目录下。 
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000001403475994.png "点击放大")
   
   
5. 在runDSC.bat同级目录下shift+鼠标右键，选择在此处打开PowerShell窗口，并执行转换。其中**D:\\DSC\\DSC\\input** 、**D:\\DSC\\DSC\\output** 、**D:\\DSC\\DSC\\log** 切换为实际DSC的路径。
   
   ```
   .\runDSC.bat --source-db Oracle --input-folder D:\DSC\DSC\input --output-folder D:\DSC\DSC\output --log-folder D:\DSC\DSC\log --application-lang SQL --conversion-type bulk --target-db gaussdbA
   ```
   
   
6. 转换完成，在DSC的output路径下自动生成转换后的DDL文件。 
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000001453595869.png "点击放大")
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000001401048824.png "点击放大")
   
   
7. 由于DWS的表定义结构与Oracle存在差异，需要手动修改转换后的表定义。
   
   如下，将文件中的\\echo整体注释掉（如果使用gsql工具导入表定义的话，不需要注释），同时手动修改指定表的分布列（distribute by hash (列名)）。
   - 修改前： ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000001451652665.png "点击放大")
     
   
   - 修改后： ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000001451653033.png "点击放大")
     
   
   
   ![](https://support.huaweicloud.com/bestpractice-dws/public_sys-resources/note_3.0-zh-cn.png)
   Hash分布表的分布列选取至关重要，需要满足以下原则：
   1. 列值应比较离散，以便数据能够均匀分布到各个DN。例如，考虑选择表的主键为分布列，如在人员信息表中选择身份证号码为分布列。
   
   2. 在满足第一条原则的情况下尽量不要选取存在常量filter的列。例如，表dwcjk相关的部分查询中出现dwcjk的列zqdh存在常量的约束（例如zqdh='000001），那么就应当尽量不用zqdh做分布列。
   
   3. 在满足前两条原则的情况，考虑选择查询中的连接条件为分布列，以便Join任务能够下推到DN中执行，且减少DN之间的通信数据量。
    
   
   
8. 完成DWS集群的创建，参见[创建集群](https://support.huaweicloud.com/mgtg-dws/dws_01_0019.html)。
9. 连接DWS数据库，使用系统管理员dbadmin用户连接，首次默认先连接默认数据库gaussdb。
10. 创建新的目标数据库test，并切换到test数据库。 
    ```
    CREATE DATABASE test WITH ENCODING 'UTF-8' DBCOMPATIBILITY 'ORA' TEMPLATE template0;
    ```
    
    
11. 创建新的Schema并切换到新的Schema，Schema名称与Oracle的用户名（本例为db_user01）保持一致。 
    ```
    CREATE SCHEMA db_user01;
    SET CURRENT_SCHEMA = db_user01;
    ```
    
    
12. 复制[7]中转换后的DDL语句到SQL窗口中执行。
13. 在DWS集群的test库中的Schema xxx下能查到APEX2_DYNAMIC_ADD_REMAIN_TEST表，即为表定义迁移完成。 
    ```
    SELECT COUNT(*) FROM db_user01.APEX2_DYNAMIC_ADD_REMAIN_TEST;
    ```
    
    
 
