
# 数据加工
数据复制服务支持对同步的对象进行加工，即可以为选择的对象添加规则。各链路支持的加工规则不一样，目前仅部分链路支持数据加工，支持数据加工链路参考[表1]，具体操作方法可参考对应的内容。
 表1支持数据加工的链路 
| **同步方向** | **数据流向**                  | **数据过滤** | **附加列** | **列加工** |
|:---|:---|:---|:---|:---|
| 入云       | MySQL-\>MySQL             | 支持       | 支持      | 支持      |
| 入云       | MySQL-\>GaussDB分布式版       | 支持       | 支持      | 支持      |
| 入云       | MySQL-\>GaussDB集中式版       | 支持       | 支持      | 支持      |
| 入云       | MySQL-\>TaurusDB          | 支持       | 支持      | 支持      |
| 入云       | MySQL-\>MariaDB           | 支持       | 支持      | 支持      |
| 入云       | DDM-\>MySQL               | 暂不支持     | 暂不支持    | 支持      |
| 入云       | DDM-\>GaussDB集中式版         | 暂不支持     | 支持      | 支持      |
| 入云       | DDM-\>GaussDB分布式版         | 暂不支持     | 支持      | 支持      |
| 入云       | Oracle-\>MySQL            | 支持       | 暂不支持    | 暂不支持    |
| 入云       | Oracle-\>TaurusDB         | 支持       | 暂不支持    | 暂不支持    |
| 入云       | Oracle-\>GaussDB集中式版      | 支持       | 暂不支持    | 支持      |
| 入云       | Oracle-\>GaussDB分布式版      | 支持       | 暂不支持    | 支持      |
| 入云       | DB2 for LUW-\>GaussDB集中式版 | 支持       | 暂不支持    | 暂不支持    |
| 入云       | DB2 for LUW-\>GaussDB分布式版 | 支持       | 暂不支持    | 暂不支持    |
| 入云       | MariaDB-\>MariaDB         | 支持       | 暂不支持    | 暂不支持    |
| 入云       | MariaDB-\>MySQL           | 支持       | 支持      | 支持      |
| 入云       | MariaDB-\>TaurusDB        | 支持       | 支持      | 支持      |
| 入云       | TaurusDB-\>TaurusDB       | 支持       | 支持      | 支持      |
| 出云       | MySQL-\>MySQL             | 支持       | 支持      | 支持      |
| 出云       | MySQL-\>kafka             | 暂不支持     | 暂不支持    | 支持      |
| 出云       | MySQL-\>Oracle            | 支持       | 暂不支持    | 暂不支持    |
| 出云       | MySQL-\>MariaDB           | 支持       | 支持      | 支持      |
| 出云       | DDM-\>MySQL               | 暂不支持     | 暂不支持    | 支持      |
| 出云       | GaussDB集中式版-\>MySQL       | 支持       | 暂不支持    | 支持      |
| 出云       | GaussDB集中式版-\>Oracle      | 支持       | 暂不支持    | 支持      |
| 出云       | GaussDB集中式版-\>Kafka       | 暂不支持     | 暂不支持    | 支持      |
| 出云       | GaussDB集中式版-\>GaussDB分布式版 | 支持       | 暂不支持    | 支持      |
| 出云       | GaussDB集中式版-\>GaussDB集中式版 | 支持       | 暂不支持    | 支持      |
| 出云       | GaussDB分布式版-\>MySQL       | 支持       | 暂不支持    | 支持      |
| 出云       | GaussDB分布式版-\>Oracle      | 支持       | 暂不支持    | 支持      |
| 出云       | GaussDB分布式版-\>Kafka       | 暂不支持     | 暂不支持    | 支持      |
| 出云       | GaussDB分布式版-\>GaussDB分布式版 | 支持       | 暂不支持    | 支持      |
| 出云       | GaussDB分布式版-\>GaussDB集中式版 | 支持       | 暂不支持    | 支持      |
| 出云       | TaurusDB-\>MySQL          | 支持       | 支持      | 暂不支持    |
| 出云       | MariaDB-\>MariaDB         | 支持       | 暂不支持    | 暂不支持    |
| 自建-自建    | MySQL-\>Kafka             | 暂不支持     | 暂不支持    | 支持      |
| 自建-自建    | MySQL-\>GaussDB分布式版       | 支持       | 支持      | 支持      |
| 自建-自建    | MySQL-\>GaussDB集中式版       | 支持       | 支持      | 支持      |
| 自建-自建    | Oracle-\>GaussDB集中式版      | 支持       | 暂不支持    | 支持      |
| 自建-自建    | Oracle-\>GaussDB分布式版      | 支持       | 暂不支持    | 支持      |
| 自建-自建    | GaussDB集中式版-\>Kafka       | 暂不支持     | 暂不支持    | 支持      |
| 自建-自建    | GaussDB分布式版-\>Kafka       | 暂不支持     | 暂不支持    | 支持      |
| 自建-自建    | DB2 for LUW-\>GaussDB集中式版 | 支持       | 暂不支持    | 暂不支持    |
| 自建-自建    | DB2 for LUW-\>GaussDB分布式版 | 支持       | 暂不支持    | 暂不支持    |
| 自建-自建    | OpenGaussDB-\>GaussDB集中式版 | 支持       | 暂不支持    | 支持      |
| 自建-自建    | OpenGaussDB-\>GaussDB分布式版 | 支持       | 暂不支持    | 支持      |
   
#### 操作视频
<video controls="controls" preload="none" id="object20265200246" class="idp-external-video" src="https://res-video.hc-cdn.com/cloudbu-site/china/zh-cn/DRS/1730795834661568727.mp4" title="数据加工" poster="https://support.huaweicloud.com/realtimesyn-drs/figure/zh-cn_image_0000002371379050.jpg" height="400.0000" width="700.0000"></video>
<video controls="controls" preload="none" id="object13583165012019" class="idp-external-video" src="https://res-video.hc-cdn.com/cloudbu-site/china/zh-cn/DRS-liejiagong/1751418941753523136.mp4" title="列加工" poster="https://support.huaweicloud.com/realtimesyn-drs/figure/zh-cn_image_0000002456222245.jpg" height="400.0000" width="700.0000"></video>
#### 添加附加列
1. 在实时同步任务的"数据加工"页面选择"附加列"，对于需要加工的表对象，单击"操作"列的添加。 
   图1附加列   
   ![](https://support.huaweicloud.com/realtimesyn-drs/figure/zh-cn_image_0000001927167249.png "点击放大")
   
   
   
2. 在弹出的"添加"对话框中，填选列名、操作类型、字段类型等信息，选择的操作类型不同，需要填写的信息也不同。完成后单击"确定"。 
   图2操作类型   
   ![](https://support.huaweicloud.com/realtimesyn-drs/figure/zh-cn_image_0000001927126901.png "点击放大")
   
   ![](https://support.huaweicloud.com/realtimesyn-drs/public_sys-resources/note_3.0-zh-cn.png)
   - 多对一映射场景下，需要使用数据加工的附加列操作来避免数据冲突。
   
   - 支持的操作类型有以下几种
     - "默认值"：使用输入的默认值填充新加的列。
     
     - "以create_time为列"和"以update_time为列"操作会分别使用数据产生时间和修改时间填充新加的列。
     
     - "表达式"：选择使用concat(_current_database, '@',_current_table) 表达式填充新加的列，暂不支持手动输入表达式。
     
     - "以serverName@database@table为列"：使用@符号分别拼接serverName、源库的库名、表名填充新加的列，其中serverName为手动输入。
     
     - "填充值"：选择填充值为新加的列，比如同步时间戳。
      
   
   - 支持"批量设置"，将第一个可编辑表的附加列信息应用到此任务中所有可编辑的表。
   
   - MySQL-\>TaurusDB同步，单表的列数超过500时， 对该表添加附加列可能会超过列数上限，会导致任务失败。
   
   - 如果使用serverName@database@table作为附加列，后续在进行数据对比时，目标端将默认使用该附加列作为行比对、内容比对的隐含过滤条件。
   
   - 有附加列的表，增量阶段不支持对表做drop table然后create table的DDL操作。
   
   - 多对一映射场景，再编辑时，若新增的表之前已同步过、做过多对一映射并且设置过附加列，需要对该表重新设置附加列，否则默认保持上一次同步时的附加列设置。
    
   
   
3. 检查无误后，单击"下一步"，进入下一步操作。
 
#### 数据过滤
数据过滤规则添加后，在源库执行更新操作的处理原则，以数据一致为首要目标。即：
- 更新前不符合过滤条件，更新后符合。继续同步，在目标库插入更新后的数据记录。
- 更新前符合过滤条件，更新后不符合。继续同步，在目标库删除更新前的数据记录，会导致数据不一致。
 
1. 在"数据加工"页面选择"数据过滤"。 
   图3数据过滤   
   ![](https://support.huaweicloud.com/realtimesyn-drs/figure/zh-cn_image_0000001927167253.png "点击放大")
   
   
2. 在"对象选择"区域选择需要加工的表对象。
3. 在过滤条件区域，填写过滤条件（只需填写SQL语句的WHERE之后部分，例如id=1）后，单击"校验规则"。 
   ![](https://support.huaweicloud.com/realtimesyn-drs/public_sys-resources/note_3.0-zh-cn.png)
   - 每张表仅支持添加一个校验规则。
   
   - 数据过滤每次最多支持512张表，如超过512张表，请分多次进行规则校验。
   
   - 过滤表达式不支持使用某种数据库引擎特有的package、函数、变量、常量等写法，须使用通用SQL标准。请直接输入SQL语句中WHERE之后的部分（不包含WHERE和分号，例如：sid \> 3 and sname like "G %"），最多支持输入512个字符。
   
   - 过滤条件填写的SQL语句中，关键字需要用反引号，datetime类型（包含日期和时间）和字符串类型需要用单引号，例如：\`update\` \> '2022-07-13 00:00:00' and age \>10、\`update\` ='abc' 。
   
   - 使用timestamp类型做过滤条件时，字符类型的时间应填写为UTC时区的时间值，例如MySQL中对timestamp类型固定按UTC时区存储，需要使用UTC时区的时间值进行比较才能达到预期效果。
   
   - 过滤条件不支持使用隐式转换规则，请填写正确的数据类型条件。例如Oracle的c列是字符类型varchar2，过滤条件应该设置为 c ＞ '10'，而不是c \> 10。
   
   - 不支持对LOB字段设置过滤条件，如CLOB、BLOB、BYTEA等大字段类型。
   
   - 不支持库名、表名带有换行符的对象设置过滤规则。
   
   - 不支持for update等行级锁的语法做过滤条件。
   
   - 不支持对列名做函数操作，如果使用函数操作可能导致数据不一致。
   
   - 建议不要对非精确类型字段设置过滤条件，如FLOAT、DECIMAL、DOUBLE等。
   
   - 建议不要对带有特殊字符的字段设置过滤条件。
   
   - 建议不要对过滤条件涉及的列做DDL操作，可能导致任务异常。
   
   - 建议不要使用非幂等表达式或函数作为数据加工条件，可能导致数据迁移失败或者数据不一致。常见的非幂等函数包括：current_date、current_time、current_timestamp、localtime、localtimestamp、rand、random、secure_rand、uuid、random_uuid等。
   
   - 任务再编辑时，已经同步的表不支持修改过滤规则。
   
   - 过滤规则中关联表的过滤条件与配置规则中对应表的过滤条件必须相同，否则可能会引起过滤数据不一致。
   
   - Oracle为源同步链路进行数据过滤时，定长字符类型NCHAR、CHAR需要使用完整固定长度字符进行匹配。
    
   
   
4. 校验通过后，单击"生成过滤规则"，即可在过滤规则表格中看到该规则。
5. 检查无误后，单击"下一步"，进入下一步操作。
 
#### 数据过滤高级设置
如果需要使用关联表查询，可以使用数据加工的高级设置功能。
1. 在实时同步任务的"数据加工"页面选择"数据过滤"。
2. 在"对象选择"区域选择需要加工的表对象。
3. 在过滤条件区域，填写联表查询过滤条件，例如：id1 in (select id from db1.tab1 where id \>=3 and id \<10)，单击"校验规则"。
   
   ![](https://support.huaweicloud.com/realtimesyn-drs/public_sys-resources/note_3.0-zh-cn.png)
   - 每张表仅支持添加一个校验规则。
   
   - 数据过滤每次最多支持512张表，如超过512张表，请分多次进行规则校验。
   
   - 过滤表达式不支持使用某种数据库引擎特有的package、函数、变量、常量等写法，须使用通用SQL标准。请直接输入SQL语句中WHERE之后的部分（不包含WHERE和分号，例如：sid \> 3 and sname like "G %"），最多支持输入512个字符。
   
   - 过滤条件不支持使用隐式转换规则，请填写正确的数据类型条件。例如Oracle的c列是字符类型varchar2，过滤条件应该设置为 c ＞ '10'，而不是c \> 10。
   
   - 不支持对LOB字段设置过滤条件，如CLOB、BLOB、BYTEA等大字段类型。
   
   - 不支持库名、表名带有换行符的对象设置过滤规则。
   
   - 不支持for update等行级锁的语法做过滤条件。
   
   - 不支持被关联表数据变动的场景，被关联表数据变动可能导致同步数据不一致。
   
   - 建议不要对非精确类型字段设置过滤条件，如FLOAT、DECIMAL、DOUBLE等。
   
   - 建议不要对带有特殊字符的字段设置过滤条件。
   
   - 建议不要使用非幂等表达式或函数作为数据加工条件，可能导致数据迁移失败或者数据不一致。常见的非幂等函数包括：current_date、current_time、current_timestamp、localtime、localtimestamp、rand、random、secure_rand、uuid、random_uuid等。
   
   - 过滤规则中关联表的过滤条件与配置规则中对应表的过滤条件必须相同，否则可能会引起过滤数据不一致。
   
   - Oracle为源同步链路进行数据过滤时，定长字符类型NCHAR、CHAR需要使用完整固定长度字符进行匹配。
   
   - 数据过滤高级设置只能在首次配置任务时进行设置，再次编辑任务的情况不支持对高级设置进行改动。
    
   
   
4. 校验通过后，单击"生成加工规则"，即可在加工规则表格中看到该规则。
5. 在"高级设置"中设置关联表的"配置条件"和"配置规则"，辅助您进行数据过滤。
   
   图4高级设置   
   ![](https://support.huaweicloud.com/realtimesyn-drs/figure/zh-cn_image_0000001881207972.png "点击放大")
   1. 在"配置条件"中，根据在[3]输入的过滤条件，填写关联表的相关信息。
      "库名"、"表名"、"列名"、"主键"、"索引"和"过滤条件"均为必填项。如果该表没有索引，则填写主键。
      "过滤条件"即在[3]输入的该关联表的过滤条件。
      
   
   2. 填写完成，单击"校验规则"。
   
   3. 校验成功后，单击"生成配置规则"。即可在配置规则表格中看到该规则。 如果需要进行多张关联表的数据过滤，重复执行[5]即可。
      ![](https://support.huaweicloud.com/realtimesyn-drs/public_sys-resources/note_3.0-zh-cn.png)
      配置规则支持删除操作。
      
   
   
   
   
6. 检查无误后，单击"下一步"，进入下一步操作。
 
#### 列加工
1. 在实时同步任务的"数据加工"页面选择"列加工"。
2. 选择列加工方式。 
   ![](https://support.huaweicloud.com/realtimesyn-drs/public_sys-resources/note_3.0-zh-cn.png)
   目前仅MySQL-\>GaussDB、Oracle-\>GaussDB、GaussDB-\>Oracle、GaussDB-\>GaussDB、GaussDB-\>MySQL支持选择导入文件方式进行列加工，其他链路默认通过对象选择方式进行列加工。
   - **对象选择方式：**
     1. 在"对象选择"区域选择需要加工的对象。
        图5列加工   
        ![](https://support.huaweicloud.com/realtimesyn-drs/figure/zh-cn_image_0000001918899926.png "点击放大") 
     
     2. 单击右侧已选对象的"编辑"。
     
     3. 在"编辑列"中，勾选需要映射的列，填写映射后的"新列名"。
        图6编辑列   
        ![](https://support.huaweicloud.com/realtimesyn-drs/figure/zh-cn_image_0000001918739998.png "点击放大")
        
        ![](https://support.huaweicloud.com/realtimesyn-drs/public_sys-resources/note_3.0-zh-cn.png)
        - 列加工提供列级的查询、映射和过滤能力。
        
        - 编辑列名后，目标数据库的列名为修改后的名称。
        
        - 列映射名不能和原列名或已存在的映射名相同。
        
        - 不支持库名、表名带有换行符的列进行映射。
        
        - 任务再编辑时，已经同步的表不支持修改列信息。
        
        - 只有勾选的列才会被同步，后续新增的列不在列加工范围内。
        
        - 不支持对分区表的分区字段进行列映射和列过滤。
        
        - 进行列过滤、列映射、附加列的表，若包含引用相关列的约束，全量阶段不支持迁移表结构。
        
        - 进行列过滤、列映射、附加列的表，增量阶段不支持对表中已过滤或映射的列进行DDL操作。
        
        - 进行列过滤、列映射、附加列的表，增量阶段不支持对表做drop table然后create table的DDL操作。
        
        - 当源数据库是MySQL或者TaurusDB时，不支持对存在函数索引的列进行列过滤、列映射。
        
        - 当源数据库是MySQL或者TaurusDB时，配置列映射和列加工后，如果目标库的表结构中存在配置了列映射和列加工的列信息，DRS会删除掉这些列。如果这些列上存在业务数据，请谨慎使用列加工和列映射功能。
          
     
     4. 填写完成后单击"确定"。
      
   
   
   
   - **文件导入方式** ：
     1. 在实时同步任务的"数据加工"页面选择"列加工 \> 导入对象文件"。
     
     2. 单击"下载模板"。
        图7列加工   
        ![](https://support.huaweicloud.com/realtimesyn-drs/figure/zh-cn_image_0000001918899930.png "点击放大")
        
        
     
     3. 在下载的Excel模板中，按照模板要求，填写需要导入的对象信息。
     
     4. 单击"添加文件"，在对话框中选择编辑完成的模板。
     
     5. 单击"上传文件"。
      
   
   
   
   
3. 检查无误后，单击"下一步"，进入下一步操作。
 
#### 数据脱敏
1. 在实时同步任务的"数据加工"页面选择"列加工"。
2. 选择列加工方式。 
   - **对象选择方式：**
     - 在"对象选择"区域选择需要加工的对象。
       图8列加工   
       ![](https://support.huaweicloud.com/realtimesyn-drs/figure/zh-cn_image_0000002571433325.png "点击放大") 
     
     - 单击右侧已选对象的"编辑"。
     
     - 在"编辑列"中，勾选需要同步的列，对需要做数据脱敏的列，选择对应的脱敏算法（默认不脱敏）。
       图9编辑列设置数据脱敏   
       ![](https://support.huaweicloud.com/realtimesyn-drs/figure/zh-cn_image_0000002540913336.png "点击放大")
       
       
     
     - 脱敏算法规则：
       
       |  脱敏类型  |                                                                              脱敏规则                                                                               |                                                                       示例                                                                        |
       |---|---|---|
       | 姓名脱敏   | 中文 / 英文均保留首尾字符，其余用\*替换。 仅 2 个字符时，保留首字符，第二位用\*替换。                                                                     | 张小明 → 张\*明 张三 → 张\* James → J\*\*\*s                           |
       | 电话号码脱敏 | 长度≥11 位：保留前 3 位 + 后 4 位，中间\*替换。 5 位＜长度＜11 位：保留前 3 位 + 后 2 位，中间\*替换。 长度≤5 位：不脱敏。 | 13812345678 → 138\*\*5678 12345678 → 123\*78 12315 → 12315     |
       | 证件号码脱敏 | 保留前 4 位 + 后 3 位，中间\*替换。 长度＜9 位时不脱敏。                                                                                   | 330110200001018888 → 3301\*\*\*\*\*\*\*\*\*\*\*888                                                                                              |
       | 银行卡号脱敏 | 保留前 4 位 + 后 4 位，中间\*替换。 长度＜16 位时不脱敏。                                                                                   | 6222021234567890 → 6222\*\*\*\*\*\*\*\*7890                                                                                                     |
       | 电子邮箱脱敏 | @前用户名仅保留首字母，其余\*替换，域名保持不变。                                                                                                                                      | myname@163.com → m\*\*\*\*\*@163.com                                                                                                            |
       | 地址脱敏   | 仅保留前 8 位字符，后续内容用\*替换。 不足 8 位时不脱敏。                                                                                      | 上海市浦东新区张江路 1 号 1-101 室 → 上海市浦东新区张 \*\*\*\*\*\*\*\*\*\*                                                                                          |
       | 日期脱敏   | 仅保留年份，月份与日期统一替换为01。                                                                                                                                             | 1998-11-25 → 1998-01-01                                                                                                                         |
       | 数值脱敏   | 所有数字统一置为0。                                                                                                                                                      | 8000.00 → 0                                                                                                                                     |
       | 敏感信息脱敏 | 固定替换为：此隐私数据不便展示，已脱敏处理。 The privacy data cannot be displayed and has been anonymized.                                     | 患有 II 型糖尿病，血糖 12.5，... → 此隐私数据不便展示，已脱敏处理。 The privacy data cannot be displayed and has been anonymized. |
          
       ![](https://support.huaweicloud.com/realtimesyn-drs/public_sys-resources/note_3.0-zh-cn.png)
       - 数据脱敏功能会在数据同步过程中生效，系统将根据用户配置的脱敏算法，对源库的全量数据与增量同步数据进行脱敏转换处理，并将脱敏后的数据写入目标库。
       
       - 启用脱敏配置后，数据传输过程中需对配置了脱敏规则的表数据逐行执行转码处理，会对全量与增量同步速率产生一定影响。
       
       - 当前仅MySQL-MySQL，Oracle-GaussDB集中式/GaussDB分布式的DRS任务支持数据脱敏设置。
       
       - 同步过程中，若源库对同步对象内的表执行**重命名表** 、**修改列名**操作，会导致该表的数据脱敏功能失效。
       
       - 当目标端数据表存在数据约束时，数据脱敏操作可能导致任务报错，或同步前后源库目标库数据量不一致。例如目标库表针对某字段配置了 CHECK(column1 \> 0) 约束，若同步任务中对该字段配置了数值脱敏规则，可能使字段值被统一脱敏为 0，此类不符合目标端约束的数据将无法写入目标库，最终造成两端数据行数不一致。
       
       - 为数据列配置【敏感数据脱敏】规则时，需确保目标库字段字符长度大于 78；若按字节长度计算，则需大于 316 字节。
       
       - 为数据列配置【日期脱敏】规则时，待处理数据需符合以下格式规范：yyyy-MM-dd、yyyy-MM-dd hh:mm:ss、yyyy-MM-dd hh:mm:ss.s及其扩展精度格式。
       
       - 当配置数据脱敏规则为【姓名脱敏、电话号码脱敏、证件号码脱敏、银行卡号脱敏、地址脱敏、电子邮件脱敏、敏感数据脱敏】时，目标库对应字段需为字符类型（char、varchar、nvarchar、text 等）或大对象类型（BLOB、CLOB 等），否则会因字段类型不兼容导致数据同步失败。
       
       - 为保障源库与目标库数据总行数一致，无主键表不支持对任意列配置数据脱敏。
       
       - 为保障源库与目标库数据总行数一致，主键表的主键列与唯一键列不支持设置数据脱敏。
       
       - 文件导入方式请参考列加工功能描述。
         
      
   
   
   
   
 
#### 查看数据过滤
1. 在"实时同步管理"页面任务列表中，选择需要查看数据加工的任务，单击任务名称。
2. 选择"数据加工"页签，查看数据过滤记录。单击右上角的![](https://support.huaweicloud.com/realtimesyn-drs/figure/zh-cn_image_0000001117359124.png)，可刷新数据。
 
#### 查看列加工
1. 在"实时同步管理"页面任务列表中，选择需要查看的任务，单击任务名称。
2. 选择"同步映射"页签，单击右上角选择列映射，查看列映射记录。单击右上角的![](https://support.huaweicloud.com/realtimesyn-drs/figure/zh-cn_image_0000001188221823.png)，可刷新数据。
   
   图10查看列映射   
   ![](https://support.huaweicloud.com/realtimesyn-drs/figure/zh-cn_image_0000001918900462.png "点击放大")
   
   
   
