在配置同步或迁移任务对象时,您可以通过设置过滤条件,将源数据库中满足您需求的数据同步或迁移到目标数据库。该功能常应用于分库分表、同步或迁移部分数据等场景。
前提条件
注意事项
不支持复杂的过滤语句,例如
COLUMN1 IN (SELECT id FROM table1)
。若源表或集合中存在两个列名仅大小写不同的列,则可能会导致过滤任务无法达到预期结果。
源数据库类型为Tair/Redis时,仅支持通过Key的前缀过滤数据。
源数据库类型为MongoDB时,仅全量同步或迁移任务支持过条件过滤,增量同步或迁移阶段不支持。
源数据库类型为除Tair/Redis和MongoDB外的数据库时,如果过滤条件需要使用引号时,请使用单引号(')。
请勿在过滤条件的末尾填入分号(;),否则可能会导致任务失败。
若在源库执行UPDATE操作,且该操作满足特定的条件(前镜像值满足过滤条件,但后镜像值不满足过滤条件),DTS默认会将UPDATE语句转换为DELETE语句,然后在目标库中执行。
重要在源库为SQL Server的DTS实例中,如果过滤的字段不是聚集索引列,则该过滤逻辑将无法生效。
操作步骤
过滤条件的设置方法与源数据库的类型有关,分为Tair/Redis、MongoDB和其他类型的数据库三种。
单个设置
在对象配置阶段,将任务对象移动到已选择对象区域框中。
说明源数据库类型为MongoDB时,任务对象的选择粒度需为集合;源数据库类型为Tair/Redis时,任务对象的选择粒度需为Redis DB;源数据库为其他类型的数据库时,任务对象的选择粒度需为表。
右键单击目标对象。
在弹出的对话框中,填入过滤条件。
源数据库类型为Tair/Redis:在弹出的编辑Schema对话框中,填入需要同步的前缀(白名单)或需要过滤的前缀(黑名单)。
源数据库类型为MongoDB:在弹出的编辑表对话框中,填入过滤条件。
源数据库类型为其他:在弹出的编辑表对话框中,填入过滤条件。
说明过滤条件的语法,请参见示例语句。
设置完成后,单击确定。
根据提示完成后续的任务配置。
批量设置
在对象配置阶段,将任务对象移动到已选择对象区域框中。
在已选择对象区域右上角,单击批量编辑。
在选择编辑对象框中,勾选需要编辑(设置前缀过滤条件)的对象。
说明选择类型保持默认即可。
在选择编辑类型区域,单击过滤条件页签。
说明若源数据库类型为Tair/Redis,则需单击同步/过滤的前缀页签。
选择选择编辑模式。
追加:保留当前任务已有的过滤条件,并增加新过滤条件。
覆盖:清除当前任务已有的过滤条件,并采用新过滤条件。
设置过滤条件。
源数据库类型为Tair/Redis:根据实际情况,勾选需要同步的前缀或需要过滤的前缀,并填入对应的前缀。
源数据库类型为MongoDB:在文本框中,填入过滤条件。
源数据库类型为其他:在文本框中,填入过滤条件。
说明过滤条件的语法,请参见示例语句。
设置完成后,单击确定。
根据提示完成后续的任务配置。
示例语句
源数据库类型为Tair/Redis
过滤类型 | 示例语句 | 说明 |
同步单个前缀 | 需要同步的前缀填入: | 只将待同步对象中Key以 |
过滤单个前缀 | 需要过滤的前缀填入: | 将待同步对象中Key以 |
同步多个前缀 | 需要同步的前缀填入: | 只将待同步对象中Key以 |
同步和过滤混用 | 需要同步的前缀填入: 需要过滤的前缀填入: | 只将待同步对象中Key以 |
源数据库类型为MongoDB
过滤类型 | 示例语句 | 说明 |
其他 |
| 以用户ID进行过滤,其中 |
源数据库为其他类型的数据库
过滤条件支持的操作符有:英文字符
=
、!=
、<
、>
、in
。若您填写过滤条件时有疑问,可以先查看常见问题。
示例语句
过滤类型 | 示例语句 | 说明 |
数值 |
| 过滤 |
字符串 |
| 过滤 |
时间 |
| 过滤2020年之后创建的数据。 重要
|
后续操作
查看过滤语句
修改过滤语句
当前任务未完成配置:返回到配置任务对象及高级配置阶段,在已选择对象区域框中展开任务同步或迁移的对象,然后右键单击目标对象,修改过滤条件。
当前任务已完成配置并运行:
迁移任务:迁移任务不支持修改过滤条件,您需要重新配置任务。
同步任务:使用修改同步对象功能进入配置任务对象及高级配置阶段,在已选择对象区域框中展开任务同步的对象,然后右键单击目标对象,修改过滤条件并根据提示完成后续的任务配置。更多信息,请参见修改同步对象。
常见报错
若您填写的过滤条件不正确,任务可能会出现如下报错,请结合具体报错信息和后续操作进行修复。
报错信息中的正则表达式((.*)?
)表示变量。
错误码 | 报错信息 | 说明 |
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迁移或同步任务,在 |