data Transmission Service (DTS) でデータ移行タスクまたはデータ同期タスクのオブジェクトを構成する場合、SQL条件を指定して、指定した条件を満たすデータのみを移行先データベースに移行または同期できます。 この機能は、データベースシャーディング、テーブルパーティション分割、部分データの同期または移行などのシナリオに適用できます。
前提条件
DTSタスクは、オブジェクトの設定と詳細設定 ステップで構成されています。 DTSタスクの設定方法の詳細については、「データ同期シナリオの概要」および「データ移行シナリオの概要」のトピックをご参照ください。
使用上の注意
複雑なSQL文をフィルター条件として使用することはできません。 例:
COLUMN1 IN (SELECT id FROM table1)
ソーステーブルまたはコレクション内の2つの列の名前が同じで、大文字でのみ異なる場合、データが期待どおりにフィルタリングされない場合があります。
ソースがTair/Redisインスタンスの場合、キーのプレフィックスを使用してのみデータをフィルタリングできます。
ソースがMongoDBデータベースの場合、完全データ同期または完全データ移行にのみフィルター条件を指定できます。 増分データ同期または増分データ移行のフィルター条件は指定できません。
ソースがTair/RedisインスタンスまたはMongoDBデータベースでない場合は、必要に応じてSQL条件で単一引用符 (') を使用します。
フィルター条件はセミコロン (;) で終わることはできません。 そうしないと、DTSタスクが失敗する可能性があります。
ソースデータベースでUPDATEステートメントを実行するとします。 前のイメージ値がフィルター条件を満たし、新しいイメージ値がフィルター条件を満たしていない場合、DTSはUPDATEステートメントをDELETEステートメントに変換し、ターゲットデータベースでDELETEステートメントを実行します。
手順
オブジェクトの設定と詳細設定 ステップで、同期または移行するオブジェクトを 選択中のオブジェクト セクションに移動し、オブジェクトを右クリックします。
説明ソースがMongoDBデータベースの場合、同期または移行するオブジェクトとしてコレクションのみを選択できます。 ソースがTair/Redisインスタンスの場合、同期または移行するオブジェクトとしてデータベースのみを選択できます。 ソースがTairまたはRedisインスタンスまたはMongoDBデータベースでない場合、同期または移行するオブジェクトとしてテーブルのみを選択できます。
表示されるダイアログボックスで、フィルタリング条件 フィールドにSQL条件を入力します。
SQL条件の構文は、Tair/Redis、MongoDB、または別の種類のデータベースなど、ソースの種類によって異なります。
ソースがTair/Redisインスタンスの場合:
スキーマの編集 ダイアログボックスで、同期するプレフィックス または フィルタリングするプレフィックス パラメーターを設定します。
サンプル条件
フィルタータイプ
例
説明
特定のプレフィックスで識別されるオブジェクトの同期
dtsnew
キーのプレフィックスに
dtsnew
が付いているオブジェクトのみが同期先に同期されます。特定のプレフィックスで識別されるオブジェクトを除外する
dtstest
キーに
dtstest
がプレフィックスされているオブジェクト以外のすべてのオブジェクトは、宛先に同期されます。複数のプレフィックスで識別されるオブジェクトを同期する
dtsnew,dtsold
キーの接頭辞に
dtsnew
またはdtsold
が付いているオブジェクトのみが同期先に同期されます。混合条件
同期するプレフィックスパラメーターを
dts
に設定します。フィルタリングするプレフィックスパラメーターを
dtstest
に設定します。キーのプレフィックスに
dts
が付いており、プレフィックスにdtstest
が付いていないオブジェクトのみが、宛先に同期されます。ソースがMongoDBデータベースの場合:
テーブルの編集 ダイアログボックスで、フィルタリング条件 フィールドでフィルター条件を指定します。
サンプル条件
フィルタータイプ
例
説明
他のタイプ
{"_id" :{$ gt:"user100844658590795 ****",$lte:"user101674868045948 ****"}
ユーザーIDでデータをフィルタリングします。 この例では、
$gt
はより大きいことを示し、$lte
はより小さいか等しいことを示します。 MongoDBデータベースでサポートされているSQL条件は、標準のSQL WHEREステートメントとは異なります。 詳細については、MongoDBドキュメントの「クエリおよび投影演算子」および「SQL to MongoDB Mapping Chart」をご参照ください。ソースが別のタイプのデータベースの場合:
テーブルの編集 ダイアログボックスで、フィルタリング条件 フィールドでフィルター条件を指定します。
説明では、フィルタリング条件フィールドでは、次の演算子がSQL条件でサポートされています。
=
,!=
,<
,>
、およびで
.フィルター条件を指定する方法の詳細については、このトピックのFAQセクションを参照してください。
サンプル条件
フィルタータイプ
例
説明
回
id > 100およびid <= 200またはid in (1, 2, 3)
id
値が100より大きく200以下のデータ、またはid
値が1、2、または3のデータを検索します。String
アドレスin('hangzhou','shanghai')
address
値がhangzhou
またはshanghai
であるデータを検索します。時間
create_time>'2020-01-01 '
またはcreate_time>'2020-01-01 00:00:00'
2020以降で作成されたデータを検索します。
重要create_time>'2020'
は入力できません。DTSはUTC + 8タイムゾーンを使用します。 タイムデータにタイムゾーン情報が含まれている場合は、フィルター条件の時刻をUTC + 8タイムゾーンの時刻に変換し、フィルタリング条件 フィールドに変換後のフィルター条件を指定する必要があります。
[OK] をクリックします。
DTSタスクに必要なその他のパラメーターを設定します。
次のステップ
フィルター条件の表示
設定中のDTSタスクについては、オブジェクトの設定と詳細設定 の手順に戻ります。 選択中のオブジェクト セクションで、同期または移行するオブジェクトを表示し、オブジェクトを右クリックします。 表示されるダイアログボックスで、フィルタリング条件 フィールドの値を表示します。
設定済みで実行中のDTSタスクの場合は、[DTSタスクの操作] 列で [タスクの複製] または [オブジェクトの再選択] をクリックして、オブジェクトの設定と詳細設定 の手順に進みます。 選択中のオブジェクト セクションで、同期または移行するオブジェクトを表示し、オブジェクトを右クリックします。 表示されるダイアログボックスで、フィルタリング条件 フィールドの値を表示します。 フィルター条件を表示したら、直接タスクをキャンセルできます。 詳細については、「類似インスタンスの作成」および「同期するオブジェクトの変更」をご参照ください。
フィルター条件の変更
設定中のDTSタスクについては、オブジェクトの設定と詳細設定 の手順に戻ります。 選択中のオブジェクト セクションで、同期または移行するオブジェクトを表示し、オブジェクトを右クリックします。 表示されるダイアログボックスで、フィルタリング条件 フィールドの値を変更します。
設定され、実行中のDTSタスクの場合:
タスクがデータ移行タスクの場合、タスクのフィルター条件を変更することはできません。 データ移行タスクを再設定する必要があります。
タスクがデータ同期タスクの場合は、DTSタスクの [操作] 列で [オブジェクトの再選択] をクリックし、オブジェクトの設定と詳細設定 の手順に進みます。 選択中のオブジェクト セクションで、同期するオブジェクトを表示し、オブジェクトを右クリックします。 表示されるダイアログボックスで、フィルタリング条件 フィールドの値を変更します。 次に、プロンプトに従ってタスクに必要な他のパラメーターを設定します。 詳細については、「同期するオブジェクトの変更」をご参照ください。
一般的なエラーとトラブルシューティング
入力したフィルター条件が無効な場合、次のエラーが発生する可能性があります。 レポートされたエラーは、エラーメッセージとこのトピックの [次の操作] セクションに基づいて修正できます。
エラーメッセージの正規表現 ((.*)?
) は変数を示します。
エラーコード | エラーメッセージ | 説明 |
DTS-RETRY-ERR-0070 | データ処理中 (.*)? 失敗 (.*)? SQL文の構文エラー | 同期するオブジェクトをフィルタリングするために使用されるフィールドは、無効な形式で指定されます。 |
DTS-RETRY-ERR-0145 | 不明な列 (.*)? in | タスクに設定されたフィルター条件のフィールドは、ソースに存在しません。 |
DTS-RETRY-ERR-0147 | SQL構文にエラーがある | タスクに設定されたフィルター条件のフィールドは、ソースに存在しません。 |
DTS-RETRY-ERR-0188 | 列のnull値 (.*)? 違反していない-null制約 | 宛先にNOT NULL制約がある列が除外されるか、ソースの対応する列の値がNULLになります。 |
DTS-RETRY-ERR-0276 | if (.*)? は空であってはならない | ターゲットElasticsearchクラスターの |
よくある質問
フィルタ条件が有効にならないのはなぜですか?
フィルター条件が無効であるか、ソースがMongoDBデータベースである増分データ同期タスクまたは増分データ移行タスクに対して指定されています。
フィルター条件が変更された後、フィルター条件は何に適用されますか?
設定中のDTSタスクの場合: ソースがMongoDBデータベースの場合、フィルター条件は完全データ同期または完全データ移行に適用されます。 ソースが別のタイプのデータベースの場合、フィルター条件は完全データ同期と増分データ同期、または完全データ移行と増分データ移行に適用されます。
設定済みで実行中のDTSタスクの場合: ソースがMongoDBデータベースの場合、フィルター条件はDTSタスクには適用されません。 ソースが別のタイプのデータベースの場合、フィルター条件は増分データ同期または増分データ移行に適用されます。
一度に複数のフィルター条件を指定できますか?
いいえ、複数のオブジェクトに対して個別にフィルター条件を指定できます。
指定された条件を満たすデータを除外し、残りのデータを同期または移行先に移行できますか?
はい。 ソースがTair/Redisインスタンスの場合、フィルタリングするプレフィックス パラメーターを設定して、データをフィルターアウトできます。
ソースが別のタイプのデータベースである場合、データを除外することはできません。 他のフィルター条件を使用して、ビジネス要件を満たすことができます。 たとえば、
age
フィールドの値が25であるデータを除外する場合、フィルタリング条件フィールドにage > 25またはage < 25
と入力できます。
複数のキーに基づいてデータをフィルタリングする場合、フィルタ条件を指定するにはどうすればよいですか?
コンマ (,) を使用して複数のキーを区切ることができます。
同期するプレフィックスとフィルタリングするプレフィックスの両方のパラメーターを設定できますか?
はい。 この場合、同期するキーのプレフィックスとフィルタアウトするキーのプレフィックスの両方のパラメータで指定されたフィルタ条件が有効になります。
API操作を呼び出してフィルター条件を指定できますか?
いいえ、APIを呼び出してフィルター条件を指定することはできません。
関連する API 操作
API 操作 | 説明 |
データ移行または同期タスクを設定します。 |