设置过滤条件

在配置同步或迁移任务对象时,您可以通过设置过滤条件,将源数据库中满足您需求的数据同步或迁移到目标数据库。该功能常应用于分库分表、同步或迁移部分数据等场景。

前提条件

当前任务处于配置任务对象及高级配置阶段。进入此阶段的方法,请参见同步方案概览迁移方案概览中的相关配置文档。

注意事项

  • 不支持复杂的过滤语句,例如COLUMN1 IN (SELECT id FROM table1)

  • 若源表或集合中存在两个列名仅大小写不同的列,则可能会导致过滤任务无法达到预期结果。

  • 源数据库类型为Tair/Redis时,仅支持通过Key的前缀过滤数据。

  • 源数据库类型为MongoDB时,仅全量同步或迁移任务支持过条件过滤,增量同步或迁移阶段不支持。

  • 源数据库类型为除Tair/RedisMongoDB外的数据库时,如果过滤条件需要使用引号时,请使用单引号(')。

  • 请勿在过滤条件的末尾输入分号(;),否则可能会导致任务失败。

  • 若在源库执行UPDATE操作,且该操作满足特定的条件(前镜像值满足过滤条件,但后镜像值不满足过滤条件),DTS默认会将UPDATE语句转换为DELETE语句,然后在目标库中执行。

    重要

    在源库为SQL Server的DTS实例中,如果过滤的字段不是聚集索引列,则该过滤逻辑将无法生效。

操作步骤

  1. 配置任务对象及高级配置阶段,将任务对象移动到已选择对象区域框中后,右键单击目标对象。

    说明

    源数据库类型为MongoDB时,任务对象的选择粒度需为集合;源数据库类型为Tair/Redis时,任务对象的选择粒度需为Redis DB;源数据库为其他类型的数据库时,任务对象的选择粒度需为表。

  2. 在弹出的对话框中,填入过滤条件

    过滤条件的语法与源数据库的类型有关,分为Tair/RedisMongoDB和其他类型的数据库三种。

    • 源数据库类型为Tair/Redis时:

      在弹出的编辑Schema对话框中,填入需要同步的前缀(白名单)或需要过滤的前缀(黑名单)。

      image.png

      示例语句

      过滤类型

      示例语句

      说明

      同步单个前缀

      dtsnew

      只将待同步对象中Key以dtsnew开始的数据同步至目标端。

      过滤单个前缀

      dtstest

      将待同步对象中Key以dtstest开始的数据进行过滤,将其余数据同步至目标端。

      同步多个前缀

      dtsnew,dtsold

      只将待同步对象中Key以dtsnewdtsold开始的数据同步至目标端。

      同步和过滤混用

      需要同步的前缀填入:dts

      需要过滤的前缀填入:dtstest

      只将待同步对象中Key以dts开始,且不以dtstest开始的数据同步至目标端。

    • 源数据库类型为MongoDB时:

      在弹出的编辑表对话框中,填入过滤条件

      image.png

      示例语句

      过滤类型

      示例语句

      说明

      其他

      {"_id":{$gt:"user100844658590795****",$lte:"user101674868045948****"}}

      以用户ID进行过滤,其中$gt表示大于,$lte表示小于等于。MongoDB过滤条件支持的语句与标准的SQL WHERE语句不同,更多信息,请参见运算符SQL语句与MongoDB语句的映射

    • 源数据库为其他类型的数据库时:

      在弹出的编辑表对话框中,填入过滤条件

      说明
      • 过滤条件支持的操作符有:英文字符=!=<>in

      • 若您填写过滤条件时有疑问,可以先查看常见问题

      image.png

      示例语句

      过滤类型

      示例语句

      说明

      数值

      id > 100 and id <= 200 or id in (1, 2, 3)

      过滤id字段大于100且小于等于200,或id字段为1、2或3的数据。

      字符串

      address in('hangzhou','shanghai')

      过滤address字段是hangzhoushanghai的数据。

      时间

      create_time>'2020-01-01'create_time>'2020-01-01 00:00:00'

      过滤2020年之后创建的数据。

      重要
      • 不支持填入create_time>'2020'

      • DTS对时间类型的数据进行过滤时,使用的是GMT+8时区。若您的时间数据包含时区信息,需要先将过滤条件的时间转换为对应GMT+8时区的时间,然后再填入过滤条件

  3. 单击确定

  4. 根据提示完成后续的任务配置。

后续操作

  • 查看过滤语句

    • 当前任务未完成配置:返回到配置任务对象及高级配置阶段,在已选择对象区域框中展开任务同步或迁移的对象,然后右键单击目标对象,查看过滤条件

    • 当前任务已完成配置并运行:可以使用创建类似任务或修改同步对象功能,进入配置任务对象及高级配置阶段,在已选择对象区域框中展开任务同步或迁移的对象,然后右键单击目标对象,查看过滤条件(查看完成后取消任务即可,无需继续往后执行)。更多信息,请参见创建类似任务修改同步对象

  • 修改过滤语句

    • 当前任务未完成配置:返回到配置任务对象及高级配置阶段,在已选择对象区域框中展开任务同步或迁移的对象,然后右键单击目标对象,修改过滤条件

    • 当前任务已完成配置并运行:

      • 迁移任务:迁移任务不支持修改过滤条件,您需要重新配置任务。

      • 同步任务:使用修改同步对象功能进入配置任务对象及高级配置阶段,在已选择对象区域框中展开任务同步的对象,然后右键单击目标对象,修改过滤条件并根据提示完成后续的任务配置。更多信息,请参见修改同步对象

常见报错

若您填写的过滤条件不正确,任务可能会出现如下报错,请结合具体报错信息和后续操作进行修复。

说明

报错信息中的正则表达式((.*)?)表示变量。

错误码

报错信息

说明

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中_id列的值为空,需要过滤掉值为空的数据。

常见问题

  • 为什么填写了过滤条件没有生效?

    过滤条件的语句填写有误,或者当前任务是源数据库为MongoDB的增量任务(不支持设置过滤条件)。

  • 修改过滤条件后,生效范围是哪些?

    • 当前任务未完成配置:源数据库为MongoDB时,仅在全量任务阶段生效;源数据库为其他类型的数据库时,全量任务和增量任务阶段均生效。

    • 当前任务已完成配置并运行:源数据库为MongoDB时,不会生效(不支持);源数据库为其他类型的数据库时,仅对增量数据生效。

  • 是否支持批量设置过滤条件?

    不支持,您可以在多个目标对象中分别填写过滤条件。

  • 是否支持将满足条件的数据过滤,将其余数据同步或迁移到目标库?

    • 源数据库类型为Tair/Redis时:支持,您可以填写需要过滤的前缀,将满足条件的Key过滤。

    • 源数据库为其他类型的数据库时:不支持,您可以尝试设置相反的过滤条件以满足您的过滤需求。例如:您需过滤掉age字段为25数据,您可以在过滤条件中填入age > 25 or age < 25

  • 若需要过滤的Key有多个,如何填写过滤条件?

    您可以使用逗号(,)进行分隔。

  • 是否可以同时填写需要同步的前缀需要过滤的前缀

    可以,填写的同步和过滤Key的规则均会生效。

  • 过滤条件是否支持调用接口?

    不支持。

相关API

API接口

说明

ConfigureDtsJob

配置DTS迁移或同步任务,在Dblist中配置filter参数设置过滤条件。