在配置同步或迁移任务对象时,您可以通过设置过滤条件,将源数据库中满足您需求的数据同步或迁移到目标数据库。该功能常应用于分库分表、同步或迁移部分数据等场景。
前提条件
注意事项
不支持复杂的过滤语句,例如
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时区的时间,然后再填入过滤条件。
单击确定。
根据提示完成后续的任务配置。
后续操作
查看过滤语句
修改过滤语句
当前任务未完成配置:返回到配置任务对象及高级配置阶段,在已选择对象区域框中展开任务同步或迁移的对象,然后右键单击目标对象,修改过滤条件。
当前任务已完成配置并运行:
迁移任务:迁移任务不支持修改过滤条件,您需要重新配置任务。
同步任务:使用修改同步对象功能进入配置任务对象及高级配置阶段,在已选择对象区域框中展开任务同步的对象,然后右键单击目标对象,修改过滤条件并根据提示完成后续的任务配置。更多信息,请参见修改同步对象。
常见报错
若您填写的过滤条件不正确,任务可能会出现如下报错,请结合具体报错信息和后续操作进行修复。
报错信息中的正则表达式((.*)?
)表示变量。
错误码 | 报错信息 | 说明 |
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迁移或同步任务,在 |