在配置同步或遷移任務對象時,您可以通過設定過濾條件,將來源資料庫中滿足您需求的資料同步或遷移到目標資料庫。該功能常應用於分庫分表、同步或遷移部分資料等情境。
前提條件
注意事項
不支援複雜的過濾語句,例如
COLUMN1 IN (SELECT id FROM table1)
。若源表或集合中存在兩個列名僅大小寫不同的列,則可能會導致過濾任務無法達到預期結果。
來源資料庫類型為Tair/Redis時,僅支援通過Key的首碼過濾資料。
來源資料庫類型為MongoDB時,僅全量同步或遷移任務支援過條件過濾,增量同步處理或遷移階段不支援。
來源資料庫類型為除Tair/Redis和MongoDB外的資料庫時,如果過濾條件需要使用引號時,請使用單引號(')。
請勿在過濾條件的末尾輸入分號(;),否則可能會導致任務失敗。
若在源庫執行UPDATE操作,且該操作滿足特定的條件(前鏡像值滿足過濾條件,但後鏡像值不滿足過濾條件),DTS預設會將UPDATE語句轉換為DELETE語句,然後在目標庫中執行。
重要在源庫為SQL Server的DTS執行個體中,如果過濾的欄位不是叢集索引列,則該過濾邏輯將無法生效。
操作步驟
在配置任務對象及高級配置階段,將任務對象移動到已選擇對象地區框中後,按右鍵目標對象。
說明來源資料庫類型為MongoDB時,任務對象的選擇粒度需為集合;來源資料庫類型為Tair/Redis時,任務對象的選擇粒度需為Redis DB;來源資料庫為其他類型的資料庫時,任務對象的選擇粒度需為表。
在彈出的對話方塊中,填入過濾條件。
過濾條件的文法與來源資料庫的類型有關,分為Tair/Redis、MongoDB和其他類型的資料庫三種。
來源資料庫類型為Tair/Redis時:
在彈出的編輯Schema對話方塊中,填入需要同步的首碼(白名單)或需要過濾的首碼(黑名單)。
樣本語句
過濾類型
樣本語句
說明
同步單個首碼
dtsnew
只將待同步對象中Key以
dtsnew
開始的資料同步至目標端。過濾單個首碼
dtstest
將待同步對象中Key以
dtstest
開始的資料進行過濾,將其餘資料同步至目標端。同步多個首碼
dtsnew,dtsold
只將待同步對象中Key以
dtsnew
和dtsold
開始的資料同步至目標端。同步和過濾混用
需要同步的首碼填入:
dts
需要過濾的首碼填入:
dtstest
只將待同步對象中Key以
dts
開始,且不以dtstest
開始的資料同步至目標端。來源資料庫類型為MongoDB時:
在彈出的編輯表對話方塊中,填入過濾條件。
樣本語句
過濾類型
樣本語句
說明
其他
{"_id":{$gt:"user100844658590795****",$lte:"user101674868045948****"}}
以使用者ID進行過濾,其中
$gt
表示大於,$lte
表示小於等於。MongoDB過濾條件支援的語句與標準的SQL WHERE語句不同,更多資訊,請參見運算子和SQL語句與MongoDB語句的映射。來源資料庫為其他類型的資料庫時:
在彈出的編輯表對話方塊中,填入過濾條件。
說明過濾條件支援的操作符有:英文字元
=
、!=
、<
、>
、in
。若您填寫過濾條件時有疑問,可以先查看常見問題。
樣本語句
過濾類型
樣本語句
說明
數值
id > 100 and id <= 200 or id in (1, 2, 3)
過濾
id
欄位大於100且小於等於200,或id
欄位為1、2或3的資料。字串
address in('hangzhou','shanghai')
過濾
address
欄位是hangzhou
或shanghai
的資料。時間
create_time>'2020-01-01'
或create_time>'2020-01-01 00:00:00'
過濾2020年之後建立的資料。
重要不支援填入
create_time>'2020'
。DTS對時間類型的資料進行過濾時,使用的是GMT+8時區。若您的時間資料包含時區資訊,需要先將過濾條件的時間轉換為對應GMT+8時區的時間,然後再填入過濾條件。
單擊確定。
根據提示完成後續的任務配置。
後續操作
查看過濾語句
修改過濾語句
當前任務未完成配置:返回到配置任務對象及高級配置階段,在已選擇對象地區框中展開任務同步或遷移的對象,然後按右鍵目標對象,修改過濾條件。
當前任務已完成配置並運行:
遷移任務:遷移任務不支援修改過濾條件,您需要重新設定任務。
同步任務:使用修改同步對象功能進入配置任務對象及高級配置階段,在已選擇對象地區框中展開任務同步的對象,然後按右鍵目標對象,修改過濾條件並根據提示完成後續的任務配置。更多資訊,請參見修改同步對象。
常見報錯
若您填寫的過濾條件不正確,任務可能會出現如下報錯,請結合具體報錯資訊和後續操作進行修複。
報錯資訊中的Regex((.*)?
)表示變數。
錯誤碼 | 報錯資訊 | 說明 |
DTS-RETRY-ERR-0070 | In process of processing data (.*)? failed (.*)? Syntax error in SQL statement | 配置同步對象的過濾欄位格式不正確。 |
DTS-RETRY-ERR-0145 | Unknown column (.*)? in | 當前任務配置的過濾條件中的欄位,在源庫中不存在。 |
DTS-RETRY-ERR-0147 | You have an error in your SQL syntax | 當前任務配置的過濾條件中的欄位,在源庫中不存在。 |
DTS-RETRY-ERR-0188 | null value in column (.*)? violates not-null constraint | 目標端有非空約束的列被過濾,或在源端沒有相應列的值。 |
DTS-RETRY-ERR-0276 | if (.*)? is specified it must not be empty | 映射到Elasticsearch中 |
常見問題
為什麼填寫了過濾條件沒有生效?
過濾條件的語句填寫有誤,或者當前任務是來源資料庫為MongoDB的增量任務(不支援設定過濾條件)。
修改過濾條件後,生效範圍是哪些?
當前任務未完成配置:來源資料庫為MongoDB時,僅在全量任務階段生效;來源資料庫為其他類型的資料庫時,全量任務和增量任務階段均生效。
當前任務已完成配置並運行:來源資料庫為MongoDB時,不會生效(不支援);來源資料庫為其他類型的資料庫時,僅對增量資料生效。
是否支援大量設定過濾條件?
不支援,您可以在多個目標對象中分別填寫過濾條件。
是否支援將滿足條件的資料過濾,將其餘資料同步或遷移到目標庫?
來源資料庫類型為Tair/Redis時:支援,您可以填寫需要過濾的首碼,將滿足條件的Key過濾。
來源資料庫為其他類型的資料庫時:不支援,您可以嘗試設定相反的過濾條件以滿足您的過濾需求。例如:您需過濾掉
age
欄位為25資料,您可以在過濾條件中填入age > 25 or age < 25
。
若需要過濾的Key有多個,如何填寫過濾條件?
您可以使用逗號(,)進行分隔。
是否可以同時填寫需要同步的首碼和需要過濾的首碼?
可以,填寫的同步和過濾Key的規則均會生效。
過濾條件是否支援調用介面?
不支援。
相關API
API介面 | 說明 |
配置DTS遷移或同步任務,在 |