操作场景
在配置同步任务时,DTS 支持对单个表或者批量对多个表设置 Where 条件过滤,只有满足设置规则的数据才会同步到目标数据库,这样用户可以灵活进行数据拆分。
适用范围
当前支持批量 Where 的同步链路:MySQL/MariaDB/Percona/TDSQL-C MySQL/TDSQL TDStore/TDSQL MySQL 相互之间、MySQL/MariaDB/Percona/TDSQL-C MySQL 同步到 Kafka 链路。
TDSQL MySQL 同步到 Kafka 链路当前仅支持对单个表设置 Where 条件,不支持批量设置 Where 条件。
约束限制
1. 不支持对整库或者整表设置 Where 条件,多个表需要设置 Where 条件过滤时,请依次勾选多个表对象,然后设置 Where 条件规则。
2. 列过滤与 Where 条件过滤的交互说明如下:
如果一个表进行了列过滤,用户同时还对该表设置 Where 规则,需要用户自行保证输入 Where 规则中的列名,包含在待同步的表中,否则 Where 规则可以设置成功,但后续任务启动后会报错。
Where 条件规则说明
1. 设置 Where 过滤条件后,单个表中只有满足设置规则的数据才会同步到目标数据库。
对于 INSERT 操作,需要插入的数据满足条件过滤规则才能同步到目标库。
对于 DELETE 操作,需要删除的数据满足条件过滤规则才能同步到目标库。
对于 UPDATE 操作,用户可根据自身需求设置不同的规则。
更新前、后数据均满足:表示更新前、后的数据都满足条件过滤规则才能同步到目标库。
更新前满足:表示更新前的数据满足条件过滤规则可以同步到目标库。
更新后满足:表示更新后的数据满足条件过滤规则可以同步到目标库。
2. Where 条件输入的规则必须是一个合法的 BOOL 表达式,并且表达式的规则相对于 MySQL 更为严格,一些在 MySQL 中支持但可能产生 WARNING 的语法(如字符串同数字比较,c1 + c2 < "abc" ),此处不支持。逻辑运算、算术运算、比较运算规则和优先级同 MySQL 一致,支持通过括号改变运算优先级,操作数中有 NULL 时,运算规则也同 MySQL 一致。DTS 系统会对输入的条件过滤规则进行验证,如果不合法会给出提醒。
3. Where 条件基本的运算规则如下:
支持引入列名作为变量。
支持逻辑运算(NOT,AND,OR,XOR,&&,||)。
支持数字类型(有符号/无符号的整型 TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,浮点类型 FLOAT 和 DOUBLE,精确类型 DECIMAL)及其算术运算(+、-、*、/、%、DIV、MOD)和比较运算(=、!=、>、<、>=、<=、<>、<=>)。
支持字符串类型(CHAR,VARCHAR)及其比较运算(二进制比较)。
支持日期类型(DATE,DATETIME,TIMESTAMP)及其比较运算。
支持时间类型(TIME)及其比较运算。支持日期/时间类型变量同字符串比较,此时字符串被转换为日期/时间类型常量,按照日期/时间比较规则进行。
输入 TIMESTAMP 默认时区为 UTC+0 时区,比较时会转换为 UTC+0 时区进行。示例:输入过滤规则为 'c1 > "2016-10-01 09:00:00"',其中 c1 为 TIMESTAMP 类型的列。则"2016-10-01 09:00:00"解析为 UTC+0 时区时间,相当于"2016-10-01 09:00:00 +00:00",比较时 c1 也会转换为 UTC+0 时区时间。
Where 条件实现示例
如下对不同场景的操作结果进行举例,各数据中 ID 为主键。
示例一:INSERT 操作
示例二:DELETE 操作
示例三:UPDATE 操作(以“更新前、后数据均满足”为例)
操作步骤
1. 在 同步任务 的设置同步选项和同步对象页面中,勾选同步对象。
说明:
依次勾选单个表,才能支持在后续步骤设置 where 条件;勾选整库/整表,不能设置 where 条件。
2. 设置数据加工规则,开启 where 条件过滤。
2.1 选择对象。
从前一步骤选择的同步对象范围中,再勾选需要设置 where 条件的对象范围。
2.2 设置过滤条件并确认。
设置 UTC 时区:指定 TIMESTAMP 类型字段比较值的时区,建议和数据库时区保持一致。
UPDATE 数据条件:可选择“更新前、后数据均满足”、“更新前满足”、“更新后满足”。
条件表达式:输入 where 条件表达式,具体规则见本章节前述的 Where 条件规则说明。设置 where 条件后点击检查条件检测输入内容的合法性,然后单击生成过滤规则。
3. 确认过滤规则,无误后单击保存并下一步进行后续同步任务流程。