同步对象映射

目标对象用 a.b.c 方式表达,比如 a 为Database,b 为 Schema,c 为 Table。

对象映射用于描述源端节点下的所有叶子对象(比如 Table )同步到目标端哪个叶子对象(比如 Table )。不同的作业类型,有不同的默认映射规则,通过修改节点上的映射规则去覆盖默认映射规则。

修改节点映射

映射可以在各个节点修改,和节点属性修改类似,有继承和覆盖方式。

映射规则可以通过“批量修改”按钮批量应用到兄弟节点

节点映射语法

目前支持三种表达方式:

1. 常量

必须用单引号括起来,单引号内部为目标对象的表达方式,比如:'a.b.c'

2. concat 函数

函数中支持常量和源端变量,常量描述如上。源端变量不用引号或者用双引号括起来,比如 SOURCE_DATABASE 表示为源端数据库名,SOURCE_SCHEMA 表示为源端 schema 名,SOURCE_OBJECT 表示为源端对象名(表、视图、函数等)。比如下图的 concat(SOURCE_DATABASE, '.', 'public', '.', SOURCE_OBJECT),表示为将源端数据库下的表同步到目标同名数据库的 public 下的表。

3. case when

对于复杂映射,比如分库分表合并到一个目标表,可以用 case when 表达,语法如下

case
when ${condition} then ${expression}
...
when ${condition} then ${expression}
else ${expression}
end

其中 expression 为上述的常量、变量或者 concat 函数;condition 目前支持两种方式:likeregexp_match

case
 when ${expression} like ${expression} then ${expression}
 when regexp_match(${expression}, ${regex}) like then ${expression}
 ...
 when ${condition} then ${expression}
 else ${expression}
end

其中 regex 为标准正则表达方式,支持将 () 内的数据作为分组提取出来,提取的变量名为 $1, $2,......, $n,可以用于 expression 表达式 例子:将源端 t1_000,t1_001,......,t1_009 映射到目标端 t1,将源端 t2_000,t2_001,......,t2_009 映射到目标端 t2 通过 like 配置分表映射

case
when SOURCE_OBJECT like 't1_%' then concat(SOURCE_DATABASE, '.public.t1')
when SOURCE_OBJECT like 't2_%' then concat(SOURCE_DATABASE, '.public.t2')
else concat(SOURCE_DATABASE, '.', 'public', '.', SOURCE_OBJECT)
end

通过 regexp_match 配置分表映射

case
 when regexp_match(SOURCE_OBJECT, '(.*)_[0-9]{3}$') then concat(SOURCE_DATABASE, '.public.', $1)
 else concat(SOURCE_DATABASE, '.', 'public', '.', SOURCE_OBJECT)
end

MySQL 导入 ProtonBase 示例

全局修改目标端 ProtonBase 的默认 Database、Schema 名称

如下图在 mysql_normal_test 数据库上用下面的映射规则(可以替换 another_dababase、another_scheam 成需要的目标名称)

concat('another_dababase', '.', 'another_scheam', '.', SOURCE_OBJECT)

修改单个表的映射

如下图在 json_type_test 表上用下面的映射规则(可以替换 another_table 成需要的目标名称)

concat(SOURCE_DATABASE, '.', 'public', '.', 'another_table')

分库分表映射一个目标表

如下图在 test 数据库上用下面的映射规则,用 case when 中的 like 去匹配分库分表

case
    when SOURCE_OBJECT like 't1_%' then concat(SOURCE_DATABASE, '.', 'public', '.', 't1')
    when SOURCE_OBJECT like 't2_%' then concat(SOURCE_DATABASE, '.', 'public', '.', 't2')
    else concat(SOURCE_DATABASE, '.', 'public', '.', SOURCE_OBJECT)
end

也可以用 regexp_match 正则去匹配:

case
    when regexp_match(SOURCE_OBJECT, '(.*)_[0-9]{3}') then concat(SOURCE_DATABASE, '.', 'public', '.', $1)
    else concat(SOURCE_DATABASE, '.', 'public', '.', SOURCE_OBJECT)
end

字段裁剪、映射、转换

Column Mapping 可以做字段的裁剪、映射和转换。

目标端已经存在的表,只能做字段裁剪和映射:

  • Action 中做字段裁剪
  • Target 中选择目标表字段

目标不存在的表,可以做字段的裁剪、转换

  • Action 中做字段裁剪
  • Target 为默认字段名称和类型,可以输入修改

默认映射

不同的作业类型,有不同的默认映射规则,参考各个作业类型的介绍。