本文介紹在DTS任務中如何通過配置ETL,解決源執行個體與目標執行個體的資料不相容問題和資料脫敏問題。
前提條件
- 已建立源和目標資料庫執行個體,本文以RDS MySQL間同步為例,建立方法,請參見快速建立RDS MySQL執行個體。
- 目標執行個體的儲存空間須大於原執行個體佔用的儲存空間。
典型應用一:非法值處理
DTS支援異構類型的資料庫之間的同步和遷移,同步或遷移時會自動進行類型映射。但是仍然會出現不可避免的資料不相容,比如MySQL同步到Oracle,源執行個體varchar(10) NOT NULL
列的Null 字元串無法寫入目標執行個體的非空列,因為Oracle會將Null 字元串等同於NULL。將會導致同步中斷。
此類問題不能簡單地跳過資料,因為會造成資料不一致。您可以為DTS任務配置ETL,使用DSL文法插入額外的轉換邏輯,對非法值進行處理。
說明 下文以RDS MySQL之間的同步為例,源執行個體允許NULL,目標執行個體不允許NULL,類比上述問題的處理。
- 源執行個體與目標執行個體建立表結構如下:
- 源執行個體
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;
- 源執行個體
- 建立源執行個體與目標執行個體間的同步任務。更多資訊,請參見同步方案概覽。配置同步任務時,以下參數需修改。
- 目標已存在表的處理模式修改為忽略報錯並繼續執行,當目標執行個體存在同名表時不報錯。
- 按右鍵已選擇對象中的目標表,修改表映射名稱為dest_table。
- 在源執行個體插入資料,插入的user值為NULL。
INSERT INTO src_table (id) VALUES (1);
因為目標執行個體user為非空列,因此同步任務會失敗。報錯資訊為:Column 'user' cannot be null
。 - 可以為同步任務配置ETL指令碼,對非法值進行處理。
- 在目標同步任務中單擊,選擇修改ETL配置。
- 在進階配置中,配置ETL功能參數選中是,DSL指令碼配置為:
e_if(op_is_null(`user`), e_set(`user`, '_NULL_'))
。說明 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文法簡介。
- 配置完成後,單擊下一步預檢查並啟動。
- 查看同步任務是否恢複。
- 在目標執行個體查詢表資料,查看NULL是否被替換為_NULL_。
典型應用二:資料脫敏
DTS可用於資料備份、Data Integration等情境,在這些情境中,可能需要對資料進行統計分析,為保證使用者的隱私資料的安全,您可以為DTS任務配置ETL,使用DSL文法插入額外的轉換邏輯,對敏感性資料進行脫敏。
配置ETL使用的DSL指令碼包含了常見的資料轉換函式(雜湊值計算等),可用於資料脫敏。本文以社會安全號碼和姓名脫敏為例。
- 源執行個體建立資料庫表並插入測試資料。
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', '李四');
- 建立源執行個體與目標執行個體間的同步任務。將
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文法簡介。
- 在目標執行個體查看同步的資料是否脫敏,查看name的值是否被用星號(*)脫敏。