全部產品
Search
文件中心

Data Transmission Service:DTS任務中配置ETL典型應用

更新時間:Jul 06, 2024

本文介紹在DTS任務中如何通過配置ETL,解決源執行個體與目標執行個體的資料不相容問題和資料脫敏問題。

前提條件

  • 已建立源和目標資料庫執行個體,本文以RDS MySQL間同步為例,建立方法,請參見快速建立RDS MySQL執行個體
  • 目標執行個體的儲存空間須大於原執行個體佔用的儲存空間。

典型應用一:非法值處理

DTS支援異構類型的資料庫之間的同步和遷移,同步或遷移時會自動進行類型映射。但是仍然會出現不可避免的資料不相容,比如MySQL同步到Oracle,源執行個體varchar(10) NOT NULL列的Null 字元串無法寫入目標執行個體的非空列,因為Oracle會將Null 字元串等同於NULL。將會導致同步中斷。

此類問題不能簡單地跳過資料,因為會造成資料不一致。您可以為DTS任務配置ETL,使用DSL文法插入額外的轉換邏輯,對非法值進行處理。

說明 下文以RDS MySQL之間的同步為例,源執行個體允許NULL,目標執行個體不允許NULL,類比上述問題的處理。
  1. 源執行個體與目標執行個體建立表結構如下:
    • 源執行個體
      CREATE DATABASE testdb;
      USE testdb;
      CREATE TABLE `src_table` (
      `id` int(11) NOT NULL,
      `user` varchar(100) NULL,
      PRIMARY KEY (`id`)
      ) ENGINE=InnoDB
      DEFAULT CHARACTER SET=utf8;
    • 目標執行個體
      CREATE DATABASE testdb;
      USE testdb;
      CREATE TABLE `dest_table` (
          `id` int(11) NOT NULL,
          `user` varchar(100) NOT NULL,
          PRIMARY KEY (`id`)
      ) ENGINE=InnoDB
      DEFAULT CHARACTER SET=utf8;
  2. 建立源執行個體與目標執行個體間的同步任務。更多資訊,請參見同步方案概覽同步任務
    配置同步任務時,以下參數需修改。
    • 目標已存在表的處理模式修改為忽略報錯並繼續執行,當目標執行個體存在同名表時不報錯。
    • 按右鍵已選擇對象中的目標表,修改表映射名稱為dest_table
    同步任務參數修改
  3. 在源執行個體插入資料,插入的user值為NULL
    INSERT INTO src_table (id) VALUES (1);
    因為目標執行個體user為非空列,因此同步任務會失敗。同步任務失敗
    報錯資訊為:Column 'user' cannot be null報錯資訊
  4. 可以為同步任務配置ETL指令碼,對非法值進行處理。
    1. 在目標同步任務中單擊點點點,選擇修改ETL配置修改ETL
    2. 在進階配置中,配置ETL功能參數選中,DSL指令碼配置為:e_if(op_is_null(`user`), e_set(`user`, '_NULL_'))配置ETL功能
      說明 DSL指令碼e_if(op_is_null(`user`), e_set(`user`, '_NULL_'))的文法組成及含義如下:
      • op_is_null(`user`):判斷user取值是否為null
      • e_set(`user`,'_NULL_'):設定user的值為_NULL_
      • e_if(op_is_null(`user`), e_set(`user`, '_NULL_')):如果user值為null,則設定為_NULL_

      DSL文法的更多介紹,請參見資料處理DSL文法簡介

    3. 配置完成後,單擊下一步預檢查並啟動
  5. 查看同步任務是否恢複。修改ETL後DTS狀態
  6. 在目標執行個體查詢表資料,查看NULL是否被替換為_NULL_

典型應用二:資料脫敏

DTS可用於資料備份、Data Integration等情境,在這些情境中,可能需要對資料進行統計分析,為保證使用者的隱私資料的安全,您可以為DTS任務配置ETL,使用DSL文法插入額外的轉換邏輯,對敏感性資料進行脫敏。

配置ETL使用的DSL指令碼包含了常見的資料轉換函式(雜湊值計算等),可用於資料脫敏。本文以社會安全號碼和姓名脫敏為例。

  1. 源執行個體建立資料庫表並插入測試資料。
    CREATE DATABASE testdb2;
    USE testdb2;
    CREATE TABLE user(id int NOT NULL PRIMARY KEY, id_card varchar(100) NOT NULL, name varchar(100) NOT NULL);
    INSERT INTO user VALUES(1, '123456789', '張三');
    INSERT INTO user VALUES(2, '987654321', '李四');
  2. 建立源執行個體與目標執行個體間的同步任務。將testdb2中的表user同步到目標執行個體。更多資訊,請參見同步方案概覽同步任務
    配置任務對象及進階配置步驟的進階配置中,配置ETL功能選擇,在輸入框中填寫如下資料脫敏語句。
    e_compose(
        e_if(op_eq(__TB__,'user'),e_set(`id_card`, str_md5(`id_card`))),
        e_if(op_eq(__TB__,'user'),e_set(`name`, str_mask(`name`, 1, 2, '*')))
    )
    說明 DSL指令碼的文法組成及含義如下:
    • str_md5(`id_card`):對id_card的值進行MD5加密。
    • str_mask(`name`, 1, 2, '*'):將name的第1位和第2位取值替換為星號(*)。
    • e_set(`id_card`, str_md5(`id_card`)):設定id_card的值為MD5加密後的密文。
    • e_set(`name`, str_mask(`name`, 1, 2, '*')):設定name的值為脫敏後的資料。
    • e_if(op_eq(__TB__,'user'),e_set(`id_card`, str_md5(`id_card`))),:將user表中id_card的值設定為MD5加密後的密文。
    • e_if(op_eq(__TB__,'user'),e_set(`name`, str_mask(`name`, 1, 2, '*'))):將user表中name的值設定為脫敏後的資料。
    • e_compose( e_if(op_eq(__TB__,'user'),e_set(`id_card`, str_md5(`id_card`))), e_if(op_eq(__TB__,'user'),e_set(`name`, str_mask(`name`, 1, 2, '*')))):對user表中id_card的值進行MD5加密,並對name的值用星號(*)替換進行脫敏。

    DSL文法的更多介紹,請參見資料處理DSL文法簡介

  3. 在目標執行個體查看同步的資料是否脫敏,查看name的值是否被用星號(*)脫敏。