
# 执行DSC进行语法迁移
本章节指导使用DSC进行语法迁移。
#### 注意事项
- 启动迁移程序前，可以自定义指定输出文件夹路径。输入文件夹路径、输出文件夹路径以及日志路径以空格隔开。默认在工具根目录下。输入文件夹路径不能包含空格。路径空格会导致DSC执行错误。详情请参见[故障处理](https://support.huaweicloud.com/tg-dws/dws_16_0210.html#ZH-CN_TOPIC_0000002202142257)。
 
- 如果输出文件夹中包含子文件夹或文件，DSC会在执行迁移前将其删除或者根据用户设置（conf文件夹中application.properties配置文件）将其覆盖。已删除或覆盖的子文件夹或文件无法通过DSC恢复。
- 如果在同一台服务器上并发进行迁移（由同一个或不同DSC执行），不同的迁移任务必须使用不同的输出文件夹路径和日志路径。
- 用户可以通过可选参数指定日志存储路径。如果路径未指定，DSC在TOOL_HOME下自动创建log文件夹。详情请参见[DSC日志参考](https://support.huaweicloud.com/tg-dws/dws_16_0032.html#ZH-CN_TOPIC_0000002538175646)。
- 单条SQL大小限制为20KB，超过此大小可能会导致执行过慢，从而转换失败。
- 为确保安全性，DSC会对其创建的文件和文件夹进行访问控制。要访问这些文件和文件夹，用户必须拥有所需权限。例如，用户需要权限600/400访问目标文件和日志文件，需要权限700访问目标文件夹和日志文件夹。此外，该工具不在日志中保存敏感数据，以确保数据安全。
- --input-folder中指定的文件或文件夹不得具有GROUP和OTHERS的写权限。 出于安全考虑，如果输入文件/文件夹具有写入权限，则该工具不会执行。
- 不得使用拥有root权限的用户在Linux中安装和执行DSC。
- DSC.jar文件中提供的umask值是系统设置值，与文件权限相关。建议用户不要修改此值。修改此值将影响文件权限。
  ![](https://support.huaweicloud.com/tg-dws/public_sys-resources/note_3.0-zh-cn.png)
  DSC是一个单机应用程序，无需与任何网络或数据库连接即可运行。它可以在与任何网络隔离的任何机器上运行。
  
#### 准备工作
在迁移之前必须先创建输入文件夹和输出文件夹，并将待迁移的所有SQL脚本复制到输入文件夹中。Linux系统操作如下：
1. 创建输入和输出文件夹。您可以根据用户的首选项在任意位置创建文件夹。用户也可以使用默认的文件夹作为输入、输出，作为包的一部分提供。 
   ```
   mkdir input
   mkdir output
   ```
   ![](https://support.huaweicloud.com/tg-dws/public_sys-resources/danger_3.0-zh-cn.png)
   由于DSC批量无序地读取输入文件夹，因此，建议在迁移开始后不要对输入文件夹和文件进行任何修改，这些异常操作将影响DSC的输出结果。
   
   
2. 将所有待迁移的 SQL文件复制到输入文件夹。 
   ![](https://support.huaweicloud.com/tg-dws/public_sys-resources/note_3.0-zh-cn.png)
   - 如果源文件的编码格式不是UTF-8，请执行以下步骤：
     1. 打开conf文件夹中的application.properties文件。
     
     2. 将application.properties文件中encodingFormat参数值修改为所需的文件编码格式。
     
     
     DSC支持UTF-8、ASCII以及GB2312编码格式。encodingFormat的值不区分大小写。
     
   
   - 如果需要获取Linux系统中源文件的编码格式，请在源文件所在服务器上执行以下命令：
     ```
     file -bi <Input file name>
     ```
     
    
   
   
#### 环境搭建及恢复（数据库及数据库用户）
**创建DWS数据库和schema**
1. 登录Postgres系统。 
   ```
   gsql -p <port> -d postgres 
   drop database <database name>;
   create database <database name>;
   \c <database name>
   GRANT ALL PRIVILEGES ON DATABASE <database name> TO <user>;
   grant database to <user>;\q
   gsql -p <port> -d <database name> -U <user> -W <password> -h <IP> -f
   drop database <database name>;
   create database <database name>;
   \c <database name>;
   GRANT ALL PRIVILEGES ON DATABASE <database name> TO <user>;
   gsql -p <port> -d <database name> -U <user> -W <password>  -f
   ```
   
   
2. 运行Setup目录下的所有文件。
**命令：**
```
sh runDSC.sh -S oracle -M blogic -I <input path> 
sh runDSC.sh -I input/ -S oracle -M ddl -L log_temp -P input/bulk/1_table/
```
#### 迁移方法
用户可在Windows和Linux操作系统中执行**runDSC.sh** 或**runDSC.bat** 命令进行迁移，各迁移场景的命令详见[表1]，带"\[\]"内的参数为可选参数。
 表1Windows和Linux场景迁移 
| **迁移场景**                                                                                            | **命令行参数**                                                                                                                                           |
|:---|:---|
|  Linux场景迁移  | ``` > ./runDSC.sh --source-db Teradata [ --input-folder <input-script-path> ] [--output-folder <output-script-path> ] [--log-folder <log-path>] ``` |
| Windows场景迁移                                                                                         | ``` > runDSC.bat --source-db Teradata [ --input-folder <input-script-path> ] [--output-folder <output-script-path> ] [--log-folder <log-path>] ```  |
   
![](https://support.huaweicloud.com/tg-dws/public_sys-resources/note_3.0-zh-cn.png)
- 命令行参数说明：
  - 简写 --source-db 缩写为 -S。
    **--input-folder** 缩写为 -I。
    **--output-folder** 缩写为 -O。
    --log-folder 缩写为 -L。
    
  
  - source-db指定源数据库，可选值为： mysql
    bigquery
    teradata
    greenplum
    netezza
    oracle
    postgres
    
   
- 命令回显说明： Migration process start time和Migration process end time分别表示迁移开始时间和结束时间。Total process time表示迁移总时长，单位为ms。此外，迁移文件总数、处理器总数、已使用处理器数量、日志文件路径以及错误日志文件路径也会显示在控制台上。
  
 
#### 任务示例
- 示例：将Teradata数据库的SQL文件迁移到适用于Linux系统下的DWS的SQL脚本中。
  ```
  ./runDSC.sh --source-db teradata 
  或 
  ./runDSC.sh -S teradata
  ```
  ```
  ./runDSC.sh --source-db teradata --input-folder D:\test\conversion\input --output-folder D:\test\conversion\output  --log-folder D:\test\conversion\log
  ```
  
- 示例：执行以下命令，将Teradata数据库的SQL文件迁移到适用于Windows操作系统下的DWS的SQL脚本中。
  ```
  runDSC.bat --source-db teradata 
  或
  runDSC.bat -S teradata
  ```
  ```
  runDSC.bat --source-db teradata --input-folder D:\test\conversion\input --output-folder D:\test\conversion\output --log-folder D:\test\conversion\log
  ```
  
控制台上显示迁移详情（包括进度和完成状态）：
```
********************** Schema Conversion Started *************************  
DSC process start time : Mon Jan 20 17:24:49 IST 2020  
Statement count progress 100% completed [FILE(1/1)]    
Schema Conversion Progress 100% completed  
**************************************************************************   
Total number of files in input folder : 1  
Total number of valid files in input folder : 1  
**************************************************************************   
Log file path :....../DSC/DSC/log/dsc.log  
Error Log file :    
DSC process end time : Mon Jan 20 17:24:49 IST 2020  
DSC total process time : 0 seconds  
********************* Schema Conversion Completed ************************
```
#### 查看并验证输出文件
迁移流程结束后，用户可使用对比工具（例如BeyondCompare®）将输入文件与输出文件进行比较。为了简化对比过程，也可以先对源SQL文件进行格式化。
1. 在Linux操作系统上运行以下命令以查看输出文件夹中的迁移文件。Windows操作系统不再赘述。
   ```
   cd OUTPUT
   ls
   ```
   显示类似以下信息：
   ```
   formattedSource    output
   user1@node79:~/Documentation/DSC/OUTPUT> cd output
   user1@node79:~/Documentation/DSC/OUTPUT/output> ls
   in_index.sql    input.sql    Input_table.sql    in_view.sql    MetadataInput.sql
   user1@node79:~/Documentation/DSC/OUTPUT/output>
   ```
   

2. 使用对比工具比较输入文件和输出文件，查看迁移后SQL文件的关键字是否符合目标数据库的要求。如果不符合，请联系技术支持处理。
 
#### 查看日志文件
所有执行及错误信息都会写入对应的日志文件。详情请参见[DSC日志参考](https://support.huaweicloud.com/tg-dws/dws_16_0032.html#ZH-CN_TOPIC_0000002538175646)。
检查日志文件是否记录错误信息。如是，请参考[故障处理](https://support.huaweicloud.com/tg-dws/dws_16_0210.html#ZH-CN_TOPIC_0000002202142257)。
