本文为您介绍如何同步 OceanBase 数据库(MySQL 和 Oracle 租户)的数据至 DataHub。
前提条件
- 数据传输已具备云资源访问权限。详情请参见 数据传输迁移角色授权。 
- 已为源端 OceanBase 数据库创建专用于数据同步任务的数据库用户,并为其赋予了相关权限。详情请参见 创建数据库用户。 
使用限制
- 选择全量同步时,数据传输仅支持同步具有唯一键的表。 
- 同步 DDL 仅支持 BLOB 类型的 Topic。 
- 数据同步过程中,数据传输支持删除表之后再新建表,即支持对已经同步的表进行 - DROP TABLE操作后,再执行- CREATE TABLE。数据传输不支持通过重命名的方式新建表,即不支持执行- RENAME TABLE a TO a_tmp操作。
- 数据传输支持字符集配置为 UTF-8 和 GBK 的数据同步。 
- 待同步的表名和其中的列名不能包含中文字符。 
- 数据传输仅支持同步库名、表名和列名为 ASCII 码且不包含特殊字符(包括换行、空格,以及 .|"'`()=;/&\)的对象。 
- 数据传输不支持 OceanBase 备库作为源端。 
DataHub 相关的使用限制如下:
- DataHub 官方限制一条消息的具体大小取决于云环境,通常为 1 MB。 
- 由于是攒批发送,DataHub 限制一次只能发送 4 MB 的消息。 
- DataHub 的官方限制和命名规范请参见 限制描述。 
注意事项
- 在源端为 OceanBase 数据库并开启同步 DDL 的数据同步任务中,如果源端库表发生重命名( - RENAME)操作,建议您重新启动任务,避免增量同步丢失数据。
- 当 OceanBase 数据库为 V4.0.0 ~ V4.3.x 之间的版本(V4.2.5 BP1 除外),并且选择了增量同步时,请为生成列配置 STORED 属性。否则增量日志中将不保存生成列的信息,可能导致增量同步数据异常的问题。 
- 当更新的行包括 LOB 列时: - 如果 LOB 列为更新列,请勿依赖 LOB 列在 - UPDATE或- DELETE操作前的值。- 目前使用 LOB 列进行存储的数据类型包括 JSON、GIS、XML、UDT(用户定义类型),以及 LONGTEXT、MEDIUMTEXT 等各类 TEXT。 
- 如果 LOB 列为非更新列,LOB 列在 - UPDATE或- DELETE操作前或操作后的值均为 NULL。
 
- 如果在创建数据同步任务时,您仅配置了 增量同步,数据传输要求源端数据库的本地增量日志保存 48 小时以上。 - 如果在创建数据同步任务时,您配置了 全量同步+增量同步,数据传输要求源端数据库的本地增量日志至少保留 7 天以上。否则数据传输可能因无法获取增量日志而导致数据同步任务失败,甚至导致源端和目标端数据不一致。 
- 同步 OceanBase 数据库的增量数据至 DataHub 时,其中包含表结构至 DataHub Schema 的初始化 Schema。下表为 DataHub 数据类型的支持情况,仅适用于 Tuple 类型的 Topic。 - 类型 - 描述 - 值域 - BIGINT - 8 字节有符号整型 - -9223372036854775807 ~ 9223372036854775807 - DOUBLE - 8 字节双精度浮点数 - -1.0 _10^308 ~ 1.0 _10^308 - BOOLEAN - 布尔类型 - True/False 
- true/false 
- 0/1 
 - TIMESTAMP - 时间戳类型 - 表示到微秒的时间戳类型 - STRING - 字符串,仅支持 UTF-8 编码 - 单个 STRING 列最大支持 2 MB - INTEGER - 4 字节整型 - -2147483648 ~ 2147483647 - FLOAT - 4 字节单精度浮点数 - -3.40292347_10^38 ~ 3.40292347_10^38 - DECIMAL - 数字型 - - 10^38 +1 ~ 10^38 - 1 
支持的源端和目标端实例类型
下表中,OceanBase 数据库 MySQL 租户简称为 OB_MySQL,OceanBase 数据库 Oracle 租户简称为 OB_Oracle。
| 源端 | 目标端 | 
| OB_MySQL(OceanBase 集群实例) | DataHub(阿里云 DataHub 实例) | 
| OB_MySQL(OceanBase 集群实例) | DataHub(公网 DataHub 实例) | 
| OB_MySQL(Serverless 实例) | DataHub(阿里云 DataHub 实例) | 
| OB_MySQL(Serverless 实例) | DataHub(公网 DataHub 实例) | 
| OB_Oracle(OceanBase 集群实例) | DataHub(阿里云 DataHub 实例) | 
| OB_Oracle(OceanBase 集群实例) | DataHub(公网 DataHub 实例) | 
同步 DDL 支持的范围
- 源端为 OceanBase 数据库 MySQL 租户时,如果您选择 Tuple 类型的 Topic,则同步 DDL 仅支持 - ALTER ADD COLUMN,并且会忽略 NOT NULL 约束。
- 源端为 OceanBase 数据库 Oracle 租户时,同步 DDL 仅支持 BLOB 类型的 Topic。 
- 修改表 - ALTER TABLE- 添加列 - ADD COLUMN
- 修改列的长度 - MODIFY COLUMN
- 删除列 - DROP COLUMN
 
- 创建索引 - CREATE INDEX
- 删除索引 - DROP INDEX
- 清空表 - TRUNCATE说明- 延迟删除场景下,同一个事务中会有两条一样的 - TRUNCATE TABLEDDL。此时,下游消费需要按照幂等方式处理。
数据类型映射
目前同步的 DataHub 类型仅支持 INTEGER、BIGINT、TIMESTAMP、FLOAT、DOUBLE、DECIMAL、STRING 和 BOOLEAN。
- 如果您选择新建 Topic 的映射方式时,创建了其他类型的 Topic,会导致数据同步失败。 
- 本文表格中提供的默认映射规则为最合适的映射。如果您改变映射,可能会产生报错。 
OceanBase 数据库 MySQL 租户和 DataHub 之间的数据类型映射
同步 OceanBase 数据库 MySQL 租户的数据至 DataHub 时,支持选择 Topic 类型为 BLOB 和 Tuple。下述表格为您介绍 DataHub(Tuple 类型)选择序列化格式为 Default 和 DTSCompatible 的数据类型映射,DataHub(BLOB 类型)的数据类型映射详情请参见 数据格式说明。
- 同步 OceanBase 数据库 MySQL 租户的数据至 DataHub(Tuple 类型) 时,选择序列化格式为 Default,数据类型映射如下。 - OceanBase 数据库 MySQL 租户 - 默认映射 DataHub 类型 - BIT - STRING(Base64 编码) - CHAR - STRING - BINARY - STRING(Base64 编码) - VARBINARY - STRING(Base64 编码) - INT - BIGINT - TINYTEXT - STRING - SMALLINT - BIGINT - MEDIUMINT - BIGINT - BIGINT - DECIMAL(因为无符号超过 Java 中的 LONG 大小) - FLOAT - DECIMAL - DOUBLE - DECIMAL - DECIMAL - DECIMAL - DATE - STRING - TIME - STRING - YEAR - BIGINT - DATETIME - STRING - TIMESTAMP - TIMESTAMP(使用毫秒级时间戳展示) - VARCHAR - STRING - TINYBLOB - STRING(Base64 编码) - TINYTEXT - STRING - BLOB - STRING(Base64 编码) - TEXT - STRING - MEDIUMBLOB - STRING(Base64 编码) - MEDIUMTEXT - STRING - LONGBLOB - STRING(Base64 编码) - LONGTEXT - STRING 
- 同步 OceanBase 数据库 MySQL 租户的数据至 DataHub(Tuple 类型) 时,选择序列化格式为 DTSCompatible,数据类型映射如下。 - OceanBase 数据库 MySQL 租户 - 默认映射 DataHub 类型 - CHAR - STRING - VARCHAR - STRING - BINARY - STRING - VARBINARY - STRING - BIT(1) - BIT 的取值包括 0 和 1。 - BOOLEAN - BIT 列值 = 0 时,则 DataHub 的 BOOLEAN 值是 - false。
- BIT 列值 = 1 时,则 DataHub 的 BOOLEAN 值是 - true。
 - BIT(n) - STRING(HEX 编码) - 目前 BIT 类型的数据存在位数可能与数据库位数无法对齐的问题。例如,bit(10),如果数据为 0,则 DTS 展示为 000,但数据传输展示为 00。 - TINYINT - BIGINT - SMALLINT - BIGINT - MEDIUMINT - BIGINT - INT - BIGINT - BIGINT - BIGINT - 由于 DataHub 的 BIGINT 是有符号的,范围为 -9223372036854775807 ~ 9223372036854775807。如果存在超出 9223372036854775807(源端是无符号位 BIGINT)的数据,会导致 DataHub 数据溢出,出现数据不一致的问题。 - FLOAT - DOUBLE - 有效位是 7 位,超出 7 位可能存在精度不一致的问题。 - DOUBLE - DOUBLE - 有效位是 16 位,超出 16 位可能存在精度不一致的问题。 - DECIMAL - DECIMAL - DATE - TIMESTAMP(使用 +08:00 时区转换,微秒精度) - TIME - STRING - YEAR - STRING - DATETIME - TIMESTAMP(使用 +08:00 时区转换,微秒精度) - TIMESTAMP - TIMESTAMP(微秒精度) - TINYTEXT - STRING - MEDIUMTEXT - STRING - TEXT - STRING - LONGTEXT - STRING - TINYBLOB - STRING(HEX 编码) - MEDIUMBLOB - STRING(HEX 编码) - BLOB - STRING(HEX 编码) - LONGBLOB - STRING(HEX 编码) 
OceanBase 数据库 Oracle 租户和 DataHub 之间的数据类型映射
| OceanBase 数据库 Oracle 租户 | 默认映射 DataHub 类型 | 
| CHAR | STRING | 
| NCHAR | STRING | 
| VARCHAR2 | STRING | 
| NVARCHAR2 | STRING | 
| CLOB | STRING | 
| BLOB | STRING(Base64 编码) | 
| NUMBER | DECIMAL | 
| BINARY_FLOAT | DECIMAL | 
| BINARY_DOUBLE | DECIMAL | 
| DATE | STRING | 
| TIMESTAMP | STRING | 
| TIMESTAMP WITH TIME ZONE | STRING | 
| TIMESTAMP WITH LOCAL TIME ZONE | STRING | 
| INTERVAL YEAR TO MONTH | STRING | 
| INTERVAL DAY TO SECOND | STRING | 
| RAW | STRING(Base64 编码) | 
补充 Properties
如果自行创建 Topic,启动数据同步任务前,请在 DataHub 的 Schema 中补充下述 Properties。如果由数据传输自动创建 Topic 和结构同步,数据传输会自动补充下述 Properties。
该部分内容适用于在 同步选项 > 高级选项 页面,选择 序列化方式 为 Default 的 Tuple 类型的 Topic。
| 名称 | 类型 | 含义 | 
| oms_timestamp | STRING | 发生变更的时间。 | 
| oms_table_name | STRING | 源端为表时,变更表名。 | 
| oms_database_name | STRING | 源端为数据库时,变更库名。 | 
| oms_sequence | STRING | 数据至同步进程内存中的时间戳,由时间 + 5 位递增数字组成。如果发生时钟回退的情况,会导致数据不一致。 | 
| oms_record_type | STRING | 变更类型,包括  | 
| oms_is_before | STRING | 如果是  | 
| oms_is_after | STRING | 如果是  | 
当源端为 OceanBase 数据库 MySQL 租户,并且在 选择同步对象 页面,选择 Topic 类型为 Tuple 时,您在 同步选项 > 高级选项 页面,选择 序列化方式 为 DTSCompatible,列名称会统一加上 dts_ 后缀。例如,源端 OceanBase 数据库 MySQL 租户中的 columnName 为 c1,同步至目标端 DataHub 中为 dts_c1。字段转换说明如下。
| 字段名称 | 数据类型 | 描述 | 
| dts_record_id | STRING | 增量日志的记录 ID,是该日志的唯一标识。 通常记录 ID 会自增,但在容灾迁移时,不同机器时钟不同步可能存在不一致的情况。 | 
| dts_operation_flag | STRING | 操作类型,取值包括: 
 | 
| dts_db_name | STRING | 数据库的名称。OceanBase 数据库的格式为 | 
| dts_table_name | STRING | 表的名称。 | 
| dts_utc_timestamp | STRING | 操作时间戳,即 Binlog 的时间戳(UTC 时间)。 | 
| dts_before_flag | STRING | 所有列的值是否为更新前的值,取值包括 Y 和 N。 | 
| dts_after_flag | STRING | 所有列的值是否为更新后的值,取值包括 Y 和 N。 | 
操作步骤
- 登录 OceanBase 管理控制台 ,购买数据同步任务。 - 详情请参见 购买数据同步任务。 
- 在 数据传输 > 数据同步 页面,单击新购买的数据同步任务后的 配置。  - 如果您需要引用已有的任务配置信息,可以单击 引用配置。详情请参见 引用和清空数据同步任务配置。 
- 在 选择源和目标 页面,配置各项参数。 - 参数 - 描述 - 同步任务名称 - 建议使用中文、数字和字母的组合。名称中不能包含空格,长度不能超过 64 个字符。 - 源端 - 如果您已新建 OceanBase 数据源,请从下拉列表中进行选择。如果未新建,请单击下拉列表中的 新建数据源,在右侧对话框进行新建。参数详情请参见 新建 OceanBase 数据源。 - 目标端 - 如果您已新建 DataHub 数据源,请从下拉列表中进行选择。如果未新建,请单击下拉列表中的 新建数据源,在右侧对话框进行新建。参数详情请参见 新建 DataHub 数据源。 - 标签(可选) - 单击文本框,在下拉列表中选择目标标签。您也可以单击 管理标签 进行新建、修改和删除。详情请参见 通过标签管理数据同步任务。 
- 单击 下一步。在 选择同步类型 页面,选择当前数据同步任务的同步类型。  - 同步类型包括 结构同步、全量同步 和 增量同步。其中,结构同步 实际为创建 Topic,增量同步 包括 DML 同步(包括 - INSERT、- DELETE和- UPDATE)和 DDL 同步,您可以根据需求进行自定义配置。详情请参见 自定义配置 DDL/DML。说明- 当源端为 OceanBase 数据库 Oracle 租户时,如果您在此处选择了 DDL 同步,则 选择同步对象 页面的 Topic 类型仅支持选择 BLOB。  
- 单击 下一步。在 选择同步对象 页面,选择当前数据同步任务需要同步的 Topic 类型和对象。 - Topic 类型包括 Tuple 和 BLOB。源端为 OceanBase 数据库 Oracle 租户时,Tuple 类型的 Topic 不支持同步 DDL,支持类似于数据库记录的数据,每条记录包含多个列。BLOB 类型的 Topic 仅支持写入一块二进制数据作为一个 Record,数据将会以 BASE64 编码传输。详情请参见 DataHub 官方文档。 - 选择需要同步的 Topic 类型后,您可以通过 指定对象 和 匹配规则 两个入口选择同步对象。本文为您介绍通过 指定对象 方式选择同步对象的具体操作,配置匹配规则的详情请参见 配置和修改匹配规则 中库到消息队列的通配规则说明和配置方式。 说明- 如果您在 选择同步类型 步骤已勾选 DDL 同步,建议通过匹配规则方式选择同步对象,以确保所有符合同步对象规则的新增对象都将被同步。如果您通过指定对象方式选择同步对象,则新增对象或重命名后的对象将不会被同步。 - 在 选择同步对象 区域,选中 指定对象。 
- 在选择区域左侧选中需要同步的对象。 
- 单击 >。 
- 根据业务需求,选择映射方式。 - 如果您需要同步 Tuple 类型的单张表或同步 BLOB 类型的表,请在 将对象映射至 Topic 对话框中,选择需要的映射方式进行配置,单击 确定。  - 如果选择同步类型时未勾选 结构同步,则仅支持选择 已有 Topic。如果选择同步类型时已选择 结构同步,则仅支持选择一种映射方式进行 Topic 的创建或选择。 - 例如,已选择结构同步的情况下,您使用了新建 Topic 和选择已有 Topic 两种映射方式,或通过重命名的方式更改了 Topic 的名称,会因为选项冲突导致预检查报错。 - 参数 - 描述 - 新建 Topic - 在文本框中输入新建 Topic 的名称。支持 128 位以内的字母、数字或下划线(_),且必须以字母开头。 - 选择 Topic - 数据传输提供查询 DataHub Topic 的能力,您可以单击 选择 Topic,在 已有 Topic 下拉列表中,搜索并选中需要同步的 Topic。 - 批量生成 Topic - 批量生成 Topic 的规则为 - Topic_${Database Name}_${Table Name}。- 如果您选择 新建 Topic 或 批量生成 Topic,结构同步成功后,在 DataHub 侧能够查询到新建的 Topic。其分片数量默认为 2 个,数据过期时间默认为 7 天,且不支持修改。 
- 如果您需要同步 Tuple 类型的多张表,请在弹出的对话框中,单击 确定。  - 如果您选择 Tuple 类型的 Topic 但未勾选 结构同步,选择多张表时,需要在 将对象映射至 Topic 对话框中选择一个已有 Topic 并单击 确定。  - 此时,右侧一个 Topic 下会显示多张表,但实际仅支持同步一张表。单击 下一步,界面会弹出提示:Tuple 类型的 Topic 与表仅支持 One to One 映射关系。  
 
 - 数据传输支持通过文本导入对象,并支持对目标端对象进行重命名、设置行过滤、移除单个对象或全部对象等操作。目标端对象的结构为 Topic>Database>Table。 说明- 通过 匹配规则 方式选择同步对象时,重命名能力由匹配规则语法覆盖,操作处仅支持设置过滤条件,以及选择分片列和需要同步的列。详情请参见 配置和修改匹配规则。  - 操作 - 描述 - 导入对象 - 在选择区域的右侧列表中,单击右上角的 导入对象。 
- 在对话框中,单击 确定。 重要- 导入会覆盖之前的操作选择,请谨慎操作。 
- 在 导入同步对象 对话框中,导入需要同步的对象。 您可以通过导入 CSV 文件的方式进行库表重命名、设置行过滤条件等操作。详情请参见 下载和导入同步对象配置。 
- 单击 检验合法性。 
- 通过合法性的检验后,单击 确定。 
 - 更改 Topic - 选择 Topic 类型为 BLOB 时,支持对目标对象进行更改 Topic 操作。详情请参见 更改 Topic。 - 设置 - 数据传输支持 - WHERE条件实现行过滤,以及选择分片列和需要同步的列。- 在选择区域的右侧列表中,鼠标悬停至目标表对象。 
- 单击显示的 设置。 
- 在 设置 对话框中,您可以进行以下操作。 - 在 行过滤条件 区域的文本框中,输入标准的 SQL 语句中的 - WHERE子句,来配置行过滤。详情请参见 SQL 条件过滤数据。
- 在 分片列 下拉列表中,选择目标分片列。您可以选择多个字段作为分片列,该参数为可选。 - 选择分片列时,如果没有特殊情况,默认选择主键即可。如果存在主键负载不均衡的情况,请选择唯一性标识且负载相对均衡的字段作为分片列,避免潜在的性能问题。分片列的主要作用如下: - 负载均衡:在目标端可以进行并发写入的情况下,通过分片列区分发送消息需要使用的特定线程。 
- 有序性:由于存在并发写入可能导致的无序问题,数据传输确保在分片列的值相同的情况下,用户接收到的消息是有序的。此处的有序是指变更顺序(DML 对于一列的执行顺序)。 
 
- 在 选择列 区域,选择需要同步的列。详情请参见 列过滤。 
 
- 单击 确定。 
 - 移除/全部移除 - 数据传输支持在数据映射时,对暂时选中到目标端的单个或多个对象进行移除操作。 - 移除单个同步对象 - 在选择区域的右侧列表中,鼠标悬停至目标对象,单击显示的 移除,即可移除该同步对象。 
- 移除全部同步对象 - 在选择区域的右侧列表中,单击右上角的 全部移除。在对话框中,单击 确定,即可移除全部同步对象。 
 
- 单击 下一步。在 同步选项 页面,配置各项参数。 - 全量同步 - 在 选择同步类型 页面,选中 全量同步,才会显示下述参数。  - 参数 - 描述 - 读取并发配置 - 该参数用于配置全量同步阶段从源端读取数据的并发数,最大限制为 512.并发数过高可能会造成源端压力过大,影响业务。 - 写入并发配置 - 该参数用于配置全量同步阶段往目标端写入数据的并发数,最大限制为 512。并发数过高可能会造成目标端压力过大,影响业务。 - 全量同步速率限制 - 您可以根据实际需求决定是否开启全量同步速率限制。如果开启,请设置 RPS(全量同步阶段每秒最多可以同步至目标端的数据行数的最大值限制)和 BPS(全量同步阶段每秒最多可以同步至目标端的数据量的最大值限制)。 说明- 此处设置的 RPS 和 BPS 仅作为限速限流能力,全量同步实际可以达到的性能受限于源端、目标端、实例规格配置等因素的影响。 
- 增量同步 - 在 选择同步类型 页面,选中 增量同步,才会显示下述参数。  - 参数 - 描述 - 写入并发配置 - 该参数用于配置增量同步阶段往目标端写入数据的并发数,最大限制为 512。并发数过高可能会造成目标端压力过大,影响业务。 - 增量同步速率限制 - 您可以根据实际需求决定是否开启增量同步速率限制。如果开启,请设置 RPS(增量同步阶段每秒最多可以同步至目标端的数据行数的最大值限制)和 BPS(增量同步阶段每秒最多可以同步至目标端的数据量的最大值限制)。 说明- 此处设置的 RPS 和 BPS 仅作为限速限流能力,增量同步实际可以达到的性能受限于源端、目标端、实例规格配置等因素的影响。 - 增量同步起始位点 - 如果选择同步类型时已选择 全量同步,则不支持修改该参数。 
- 如果选择同步类型时未选择 全量同步,但选择了 增量同步,请在此处指定同步某个时间节点之后的数据,默认为当前系统时间。详情请参见 设置增量同步位点。 
 
- 高级选项  - 参数 - 描述 - 序列化方式 - 控制数据同步至 DataHub 的消息格式,目前支持 Default、Canal、DataWorks(支持 V2.0)、SharePlex、DefaultExtendColumnType、Debezium、DebeziumFlatten、DebeziumSmt 和 DTSCompatible。详情请参见 序列化方式的格式说明。 重要- 仅在 选择同步对象 页面,选择 Topic 类型为 BLOB 时,或源端为 OceanBase 数据库 MySQL 租户并选择 Topic 类型为 Tuple 时,才会显示该参数。 
- 目前仅 OceanBase 数据库 MySQL 租户支持 Debezium、DebeziumFlatten、DebeziumSmt 和 DTSCompatible。 
- 当源端为 OceanBase 数据库 MySQL 租户,并且在 选择同步对象 页面,选择 Topic 类型为 Tuple 时,序列化方式支持 Default 和 DTSCompatible。 
 - 分区规则 - 同步源端数据至 DataHub Topic 的规则,目前支持 Hash 和 Table。推荐您选择 Table,以确保下游在消费消息时,不会出现 DDL 与 DML 消费不统一的情况。 - Hash 表示数据传输使用一定的 Hash 算法,根据主键值或分片列值 Hash 选择 DataHub 的 Shard。 
- Table 表示数据传输将一张表中的全部数据投递至同一个分区中,以表名作为 Hash 键。 
 说明- 如果在 选择同步类型 页面选择了 同步 DDL,则分区规则仅支持 Table。 - 业务系统标识(可选) - 仅选择 序列化方式 为 DataWorks 时,会显示该参数,用于标识数据的业务系统来源,以便您后续进行自定义处理。该业务系统标识的长度限制为 1~20 个字符。 
 
- 单击 预检查。 - 在 预检查 环节,数据传输仅检查列名、列类型,以及是否为空,不检查长度和默认值。如果预检查报错: - 您可以在排查并处理问题后,重新执行预检查,直至预检查成功。 
- 您也可以单击错误预检查项操作列中的 跳过,会弹出对话框提示您跳过本操作的具体影响,确认可以跳过后,请单击对话框中的 确定。 
 
- 预检查成功后,单击 启动任务。 - 如果您暂时无需启动任务,请单击 保存。后续您只能在 同步任务列表 页面手动启动任务或通过批量操作启动任务。批量操作的详情请参见 批量操作数据同步任务。 - 数据传输支持在数据同步任务运行过程中修改同步对象,详情请参见 查看和修改同步对象及其过滤条件。数据同步任务启动后,会根据选择的同步类型依次执行,详情请参见 查看同步详情。 
如果数据同步任务运行报错(通常由于网络不通或进程启动过慢导致),您可以在数据同步任务的列表或详情页面,单击 恢复。