本文为您介绍迁移/同步对象匹配规则的背景信息、使用限制、配置方式,以及库到库场景示例和常见问题。
背景信息
您在创建数据迁移或数据同步任务时,需要指定具体的迁移或同步的对象。数据传输提供指定对象、导入对象和匹配规则三种方式供您选择。其中匹配规则方式支持您通过编写通配规则指定需要迁移或同步的对象,并且支持配置源端及目标端的对象映射逻辑,通过简单、高效的字符串匹配能力,可以有效地降低您在待迁移/同步对象数量众多时的配置难度。同时,符合匹配规则的新增表可以通过增量 DDL 的方式自动同步至目标端。数据迁移增量 DDL 的详情请参见 同步 DDL 的支持范围和使用限制。
库到库的通配规则说明
数据传输支持的数据库到数据库的通配规则及其要求如下。
下方表格中的星号(*)表示通配规则。
类别 | 支持的通配规则 | 示例 | 说明 |
库表平迁 | *.* | kd_test*.person* | 将源端 kd_test 开头的所有库下 person 开头的所有表迁移至目标端,库名、表名保持不变。 |
*.<源端表> | kd_test*.person | 将源端 kd_test 开头的所有库下 person 表迁移至目标端,库名、表名保持不变。 | |
<源端库>.* | kd_test.person* | 将源端名为 kd_test 的库下 person 开头的所有表迁移至目标端,库名、表名保持不变。 | |
<源端库>.<源端表> | kd_test.person | 将源端名为 kd_test 的库下名为 person 的表迁移至目标端,库名、表名保持不变。 | |
库表重命名 | <源端库>.<源端表>=<目标端库>.<目标端表> | kd_test.person=kd_test_new.person_new | 将源端名为 kd_test 的库下名为 person 的表迁移至目标端,并且将库 kd_test 重命名为 kd_test_new,表 person 重命名为 person_new。 |
<源端库>.*=<目标端库>.* | kd_test.person*=kd_test_new.person* | 将源端名为 kd_test 的库下 person 开头的所有表迁移至目标端,并且将库 kd_test 重命名为 kd_test_new,表名保持不变。 | |
*.<源端表>=*.<目标端表> | kd_test*.person=kd_test*.person_new | 将源端 kd_test 开头的所有库下名为 person 的表迁移至目标端,并且将表 person 重命名为 person_new,库名保持不变。 | |
库表汇聚 | <源端库>.*=<目标端库>.<目标端表> | kd_test.person*=kd_test.person_all | 将源端名为 kd_test 的库下 person 开头的所有表汇聚至目标端库 kd_test 下的表 person_all 中。 |
*.<源端表>=<目标端库>.<目标端表> | kd_test*.person=kd_test_all.person | 将源端以 kd_test 开头的所有库下名为 person 的表汇聚至目标端库 kd_test_all 下的表 person 中。 | |
*.*=<目标端库>.<目标端表> | kd_test*.person*=kd_test_all.person_all | 将源端以 kd_test 开头的所有库下以 person 开头的所有表汇聚至目标端库 kd_test_all 下的表 person_all 中。 | |
*.*=<目标端库>.* | kd_test*.person*=kd_test_all.person* | 将源端以 kd_test 开头的所有库下以 person 开头的所有表汇聚至目标端库 kd_test_all 下,表名保持不变。 | |
*.*=*.<目标端表> | kd_test*.person*=kd_test*.person_all | 将源端以 kd_test 开头的所有库下以 person 开头的所有表汇聚至目标端以 kd_test 开头的库下的表 person_all 中,库名保持不变。 |
通配规则要求如下:
目标端的库名和表名不允许同时为通配规则。例如,
kd_test*.person*=kd_test*.person*
。如果源端库和目标端库均为通配规则,则库级别的表达式必须完全一样,表示库平迁。
如果源端表和目标端表均为通配规则,则表级别的表达式必须完全一样,表示表平迁。
如果目标端库为通配规则,则源端库必须也为通配规则。
如果目标端表为通配规则,则源端表必须也为通配规则。
库到消息队列的通配规则说明
数据传输支持的数据库到消息队列的通配规则及其要求如下。
下方表格中的星号(*)表示通配规则。
支持的通配规则 | 示例 | 说明 |
*.*=<Topic 名> | *.*=topic | 将多库下的多表映射到一个 Topic |
*.<源端表>=<Topic 名> | *.b=topic | 将多库下的表 b 映射到一个 Topic |
<源端库>.*=<Topic 名> | a.*=topic | 将库 a 下的多张表映射到一个 Topic |
<源端库>.<源端表>=<Topic 名> | a.b=topic | 将库 a 下的表 b 映射到一个 Topic |
使用限制
数据传输允许输入多条规则,但需要注意每条规则不能跨行且前后不允许有空格。
迁移或同步对象规则不允许为空,排除对象规则允许为空。
数据传输不支持在结构迁移、全量迁移期间进行 DDL 变更。
通过匹配规则的方式选择迁移或同步对象时,数据传输不支持表名包含特殊字符(包括换行、空格,以及 .|"'`()=;/&\*?[][!])。
数据传输不支持通过多条匹配规则,将源端同一个库下的不同表映射至目标端的不同库下。例如,
a.a* = b.a* & a.b* = c.b*
。存在库或表汇聚的场景下,不支持反向增量。
说明数据传输仅在保存或启动数据迁移/数据同步任务时,根据已有的库表是否存在汇聚场景进行判断。如果在任务运行过程中新出现库表汇聚的场景,则不会被数据传输拦截,可能出现反向增量无法正确识别库表映射关系,导致数据质量问题。
数据传输暂不支持 CREATE DATBASE 的 DDL 语句。如果新建的库名在迁移/同步的匹配规则内,您需要手动在目标端创建数据库才能继续新增库的数据同步。
注意事项
当您完成配置迁移/同步对象规则和排除对象规则后,如果源端表名在迁移/同步对象规则和排除对象规则的差集内,则相关对象可以被选择。
说明差集是指对于给定的两个集合,返回一个包含所有存在于第一个集合但不存在于第二个集合的元素的新集合。
开启同步 DDL 功能后,当您使用 DDL 语句在源端创建一张新表或者修改一张表结构时,如果对应的表名在迁移/同步对象规则和排除对象规则的差集内,则该 DDL 语句可以被数据传输同步至目标端。
库表汇聚场景下:
建议您使用匹配规则的方式映射源端和目标端的关系。
建议您自行在目标端创建表结构。如果使用数据传输创建,请在结构迁移步骤跳过部分失败对象。
如果您在库或表汇聚的场景下勾选了 DDL 同步,可能存在误删风险。例如,源端多个库或表汇聚至目标端的一个库或表中。此时,删除源端的一个库或表,可能导致目标端的汇聚库或表被删除。
您在创建数据迁移任务时,请将 全量迁移 > 目标端对象存在记录时处理策略 配置为 忽略。
说明选择 忽略,全量校验将使用 IN 模式拉取数据,无法校验目标端多数据的场景,并且校验性能存在一定程度降级。
如果表存在重命名映射,则优先重命名映射。例如,同时存在规则
a.b[0-3]
和a.b[3-5]=a.c
,则表a.b3
重命名为a.c
。执行 RENAME TABLE 的 DDL 语句时,如果 RENAME 后的表对象不在原匹配规则或排除规则内,可能导致非预期同步问题,请谨慎操作。
配置库到库的匹配规则
新建数据迁移或数据同步任务,并配置至 选择迁移对象 或 选择同步对象 步骤。
说明选择迁移对象和选择同步对象的操作相同,本文以选择迁移对象为例进行介绍。
数据同步任务中,OceanBase 数据库 MySQL 租户至 AnalyticDB MySQL、RDS PostgreSQL 实例至 OceanBase 数据库 Oracle 租户 和 OceanBase 数据库 MySQL 租户之间的数据同步 为库到库的匹配规则配置。
在 选择迁移对象 区域,选中 匹配规则。
在 选择迁移范围 区域,输入 迁移对象规则 和 排除对象规则(可选)。支持的匹配规则详情请参见 通配符规则说明。
说明如果您配置的规则中包含空格,可能导致迁移或同步对象有误。
单击 校验。
如果您需要查看匹配结果,请在校验成功后单击 预览对象 进行查看。您填写的通配迁移对象规则和排除对象规则,会同时应用于表和视图。匹配结果 包括最终对象、新增对象和减少对象。
对象
描述
最终对象
配置的匹配规则最终匹配的迁移对象。
新增对象
最终匹配结果和前一次配置的匹配结果相比,新增的迁移对象。
减少对象
最终匹配结果和前一次配置的匹配结果相比,减少的迁移对象。
通过匹配规则的方式选择需要迁移或同步的对象后,您可以进行设置过滤条件的操作。
在 匹配结果 > 最终对象 面板,鼠标悬停至目标表对象。
单击显示的 设置。
在 设置 对话框中,输入标准的 SQL 语句中的
WHERE
子句,来配置行过滤。配置完成后,单击 验证语法。详情请参见 SQL 条件过滤数据。语法验证通过后,单击 确定。
您还可以在 查看列 区域,查看迁移对象的列信息。
根据提示完成后续的任务配置。
场景示例
库表平迁
将源端 jenkins_api 开头的所有库下,以 test 开头的所有表迁移至目标端,库名、表名保持不变。匹配规则的配置如下。
库表重命名
将源端名为 jenkins_my2dh_one 的库下,以 test 开头的所有表迁移至目标端,并且将库 jenkins_my2dh_one 重命名为 jenkins_my2dh_one_new,表名保持不变。匹配规则的配置如下。
库表汇聚
将源端以 jenkins_api 开头的所有库下,以 order 开头的所有表汇聚至目标端库 jenkins_api_all 下的表 order 中。匹配规则的配置如下。
配置排除对象规则
设置无需同步源端名为 jenkins_api_mysql56 的库下的历史表和日志表,且历史表以 "history_" 开头,日志表以 log 结尾。匹配规则的配置如下。
配置库到消息队列的匹配规则
同步 OceanBase 数据库的数据至 DataHub、Kafka 和 RocketMQ 时,您可以通过配置匹配规则的方式选择需要同步的对象。
新建数据同步任务,并配置至 选择同步对象 步骤。
详情请参见相应类型的 数据同步 任务文档。
在 选择同步对象 区域,选中 匹配规则。
输入 同步对象规则 和 排除对象规则(可选)。支持的匹配规则详情请参见 通配符规则说明。
三种类型的数据同步任务在进行匹配规则配置时,业务逻辑存在差异。
目标端为 DataHub 时,支持选择 Topic 类型为 Tuple 或 BLOB。
Tuple 类型仅支持输入已有的 Topic 名称,且不支持通配符和空格。选中表后,会一对一映射到 Topic 中。
BLOB 类型支持多对一或一对一映射,请注意不支持空格。
如果选择同步类型时已选择 结构同步,您可以输入已有 Topic 的名称或新建 Topic,仅支持选择一种映射方式进行 Topic 的创建或选择。如果选择同步类型时未勾选 结构同步,则仅支持输入已有 Topic 的名称。
目标端为 Kafka 或 RocketMQ 时,支持多对一或一对一映射,请注意不支持空格。
如果选择同步类型时已勾选 结构同步,您可以输入已有 Topic 的名称或新建 Topic。如果选择同步类型时未勾选 结构同步,则仅支持输入已有 Topic 的名称。
单击 校验。
如果您需要查看匹配结果,请在校验成功后单击 预览对象 进行查看。匹配结果 包括最终对象、新增对象和减少对象。
通过匹配规则的方式选择需要同步的对象后,您可以进行设置过滤条件的操作。
在 匹配结果 > 最终对象 面板,鼠标悬停至目标表对象。
单击显示的 设置。
在 设置 对话框中,您可以进行以下操作。
在 行过滤条件 区域的文本框中,输入标准的 SQL 语句中的
WHERE
子句,来配置行过滤。配置完成后,单击 验证语法。详情请参见 SQL 条件过滤数据。在 分片列 下拉列表中,选择目标分片列。您可以选择多个字段作为分片列,该参数为可选。
选择分片列时,如果没有特殊情况,默认选择主键即可。如果存在主键负载不均衡的情况,请选择唯一性标识且负载相对均衡的字段作为分片列,避免潜在的性能问题。分片列的主要作用如下:
负载均衡:在目标端可以进行并发写入的情况下,通过分片列区分发送消息需要使用的特定线程。
有序性:由于存在并发写入可能导致的无序问题,数据传输确保在分片列的值相同的情况下,用户接收到的消息是有序的。此处的有序是指变更顺序(DML 对于一列的执行顺序)。
在 选择列 区域,选择需要同步的列。详情请参见 列过滤。
单击 确定。
根据提示完成后续的任务配置。
常见问题
权限不足
请注意源端用户的权限设置问题。如果您授予用户的权限不足,部分对象未被数据传输从前端展示出来,会导致您不能正确配置匹配规则。因此您需要将未授予权限的对象加入 排除对象规则,以避免数据传输因无法找到目标端对象而造成数据迁移或数据同步任务中断。
不支持过滤 DML
在未开启同步 DDL 的情况下,数据传输允许使用匹配规则的方式选择对象。在增量同步的过程中,如果新建表满足匹配规则,相关的 DDL 语句会被忽略,但数据传输会继续同步 DML 语句,这样会造成无法写入目标端对象而造成数据迁移或数据同步任务中断,因此您需要在目标端新建表或者将表加入黑名单。