需要将自建 Oracle 数据库中的数据用于实时分析时,可以使用数据传输服务 DTS(Data Transmission Service)将其同步至云原生数据仓库 AnalyticDB MySQL 版 3.0 集群。本文介绍一对一单向同步的配置流程,即由一个自建 Oracle 数据库向一个 AnalyticDB MySQL 3.0 集群传输数据,同步类型包含库表结构同步、全量同步和增量同步。
开始前必须满足的约束
以下约束不满足时任务无法启动,或会导致目标数据被覆盖。配置任务前逐条确认。
源表主键:待同步的表必须有主键,且同步对象必须包含全部主键列。增量 CREATE TABLE 必须直接包含主键定义;无主键建表会被跳过,不能依赖后续 ADD CONSTRAINT 补充主键。
目标表主键:目标表必须有与源记录对应的自定义主键,不允许依赖目标端生成的隐藏主键。分布键、分区键必须满足 AnalyticDB MySQL 的主键要求。
归档与补充日志:包含增量同步时,必须开启 ARCHIVELOG 和 Supplemental Logging,并包含主键、唯一键所需的补充日志。Redo Log 和 Archive Log 至少保留 7 天,任务账号必须能读取所需日志。开启方法见下文准备工作。
任务期间的源库操作:库表结构同步和全量同步期间请勿执行 DDL。增量阶段不得通过 Oracle Data Pump 导入待同步数据,不得执行 RESETLOGS。
目标表写入:任务运行期间,不允许其他应用写入同一目标表。全量写入和增量 INSERT、UPDATE 均使用替换写入,同主键记录可能被源记录覆盖。
DDL 执行结果:部分不支持的 DDL 会被跳过并记录告警。必须检查任务日志,并核对主键、列类型和目标数据;不能仅凭任务处于运行中判断 DDL 已执行成功。
前提条件
已部署源自建 Oracle 数据库,且源库版本和架构满足接入要求。接入要求见 Oracle 数据库的限制和准备工作。
已创建目标 AnalyticDB MySQL 3.0 集群,且集群有足够空间容纳待同步数据及写入过程中的额外存储。创建方法见创建集群。
已完成下文准备工作中的账号授权、日志配置、网络访问和字段检查,不符合本文限制的对象已先行处理,再开始配置同步任务。
费用说明
| 同步类型 | 链路配置费用 |
| 库表结构同步和全量同步 | 不收取链路配置费用。 |
| 增量同步 | 收费,具体规则见计费概述。 |
源、目标数据库及相关网络资源的费用按对应产品规则计算。涉及公网流量时,同时核对 DTS 的流量计费条件。
同步范围与目标表限制
源库对象范围
不支持嵌套表、外部表,以及视图、物化视图、同义词、序列、触发器、存储过程、存储函数、包和独立 TYPE、TYPE BODY 对象的结构同步。对象类型列可以转为字符串,嵌套表和类型对象本身不在同步范围内。
DTS 不会将 Oracle 的普通索引、唯一索引、外键、CHECK 约束以及 PL/SQL 对象转换为目标库中的等价对象。
库表结构同步支持表注释,不支持独立的列注释迁移。
目标表设计
Oracle 的空字符串按 NULL 处理。请勿为可能收到空字符串或 NULL 的目标列设置不兼容的非空约束。
支持同步的 SQL 操作
| 操作类型 | SQL 操作语句 |
| DML | INSERT、UPDATE、DELETE |
| DDL | CREATE TABLE;ALTER TABLE 的 ADD、DROP COLUMN、RENAME COLUMN、RENAME TO;TRUNCATE TABLE;符合下述条件的 DROP TABLE。 |
增量 INSERT 和普通 UPDATE 在目标端按 REPLACE INTO 写入;更新主键时,先删除旧主键记录,再写入新记录。主键及更新前后的行信息必须完整。
增量新建表必须纳入同步对象范围,且 CREATE TABLE 需包含主键,目标分布键使用主键列。
不支持 MODIFY 列类型(MODIFY COLUMN)、修改列默认值、索引、约束、COMMENT ON TABLE 和 COMMENT ON COLUMN、SET UNUSED 和 DROP UNUSED COLUMNS 操作。
表重命名仅支持 ALTER TABLE ... RENAME TO,不支持独立 RENAME 语句,且不要连续重命名同一待同步表。
不支持分区 DDL、表空间和存储属性变更、LOB 存储属性变更。任务期间请勿执行引起 ROWID 变化的 MOVE、SHRINK、SPLIT PARTITION 等操作。Oracle 数据库的限制和准备工作列出了源库的完整要求。
普通 DROP TABLE 和 TRUNCATE TABLE 属于转换范围。开启回收站时,DROP TABLE 的日志记录可能表现为回收站重命名及扩展删除语句,不能按普通 DROP TABLE 保证目标表被删除;涉及 Oracle 回收站、CASCADE CONSTRAINTS 等扩展形式时,确认无需源端闪回恢复后采用 PURGE 方式,并检查目标端结果。
新建表和新增列可能附带目标辅助索引,源库的索引 DDL 不在同步范围内。
一条源 DDL 可能拆为多条目标语句执行。发生错误时,前面的语句可能已经生效,需核对完整结果。
新增列的默认值不用于保证目标历史行与源端一致。涉及默认值补齐历史行的场景,先完成数据验证。
数据类型映射关系
结构同步与增量 DDL 使用不同的转换入口,部分类型在两个入口下得到不同的目标类型。启动前核对实际生成的目标表定义。
下表中 NUMBER(p,0)、NUMBER(*,0)、INTEGER 和 SMALLINT 等整数别名、RAW 和 LONG RAW 和 BLOB 在两个入口下生成不同的目标类型,均已标注两入口结果不同。按结构同步的目标类型规划目标表和下游查询前,先逐行核对这些类型。新增表或新增列不会自动继承既有目标表的人工类型调整。
| Oracle 类型 | 结构同步的目标类型 | 增量 CREATE TABLE、ADD 列的目标类型 | 说明 |
| NUMBER(无精度) | DECIMAL(38,18) | DECIMAL(38,18) | 源端值域可能超出该类型,启动前评估实际范围。 |
| NUMBER(p),1≤p≤2 | TINYINT | TINYINT | 源值必须落在目标整数范围内。 |
| NUMBER(p),3≤p≤4 | SMALLINT | SMALLINT | 源值必须落在目标整数范围内。 |
| NUMBER(p),5≤p≤6 | MEDIUMINT | MEDIUMINT | 目标库可按 INT 兼容类型处理。 |
| NUMBER(p),7≤p≤9 | INT | INT | 源值必须落在目标整数范围内。 |
| NUMBER(p),10≤p≤18 | BIGINT | BIGINT | 源值必须落在目标整数范围内。 |
| NUMBER(p),19≤p≤38 | DECIMAL(p,0) | DECIMAL(p,0) | 保留整数精度。 |
| NUMBER(p,0) | DECIMAL(p,0) | 按 NUMBER(p) 选择整数或 DECIMAL 类型 | 两入口结果不同。启动前核对实际生成的目标表定义。 |
| NUMBER(p,s),0<s≤min(p,18) | DECIMAL(p,s) | DECIMAL(p,s) | p 还需满足目标精度限制。 |
| NUMBER(*,0) | 可能生成 DECIMAL(38,18) | DECIMAL(38,0) | 两入口结果不同。显式确认目标精度,避免依赖星号形式的自动转换。 |
| INTEGER、SMALLINT 等整数别名 | BIGINT;源端定义为 NUMBER 时按 NUMBER 规则处理 | INTEGER、SMALLINT 映射为 DECIMAL(38,0) | 两入口结果不同。建议先以显式 NUMBER(p,0) 确认需要的值域。 |
| BINARY_FLOAT | FLOAT | FLOAT | NaN、正负 Infinity 写入数值目标列时转为 NULL,写入 VARCHAR 时可保留文本表示。需保留特殊值时,预先配置字符串目标列,并确认目标列允许所需数据。 |
| BINARY_DOUBLE、DOUBLE PRECISION | DOUBLE | DOUBLE | 特殊值处理同 BINARY_FLOAT。 |
| FLOAT(n),n≤53 | FLOAT | FLOAT | Oracle 的二进制精度参数与目标 FLOAT 精度并非等价,启动前核对生成的目标列定义。 |
| FLOAT、FLOAT(n),n>53 | DOUBLE | DOUBLE | 可能损失精度。 |
| REAL | FLOAT | FLOAT | 浮点近似表示。 |
| CHAR(n)(可解析长度且 n≤255,非 CHAR 字符语义) | CHAR(n) | CHAR(n) | 其余 CHAR 定义按 VARCHAR 处理。 |
| VARCHAR2、NVARCHAR2、NCHAR、LONG、CLOB、NCLOB | VARCHAR | VARCHAR | 不保留源端长度、BYTE/CHAR 语义和 LOB 存储属性。 |
| DATE | DATETIME | DATETIME | 保留源值的日期和时间部分,不转换为仅日期的 DATE。 |
| TIMESTAMP | DATETIME | DATETIME | 最高按毫秒精度写入。 |
| TIMESTAMP WITH TIME ZONE、TIMESTAMP WITH LOCAL TIME ZONE | TIMESTAMP | TIMESTAMP | 带时区时间戳的原时区名称、偏移量不作为独立字段保留。核对源端、DTS 及查询会话的时区配置。 |
| INTERVAL YEAR TO MONTH、INTERVAL DAY TO SECOND | VARCHAR | VARCHAR | 保存时间间隔文本。 |
| RAW、LONG RAW、BLOB | BINARY | VARBINARY | 两入口结果不同。保存二进制内容;目标展示可能规范化为 BINARY。 |
| ROWID、UROWID、XMLTYPE | VARCHAR | VARCHAR | 保存文本,不保留行地址或 XML 类型能力。 |
| 用户自定义对象列、VARRAY 列 | VARCHAR | 通常按自定义类型名称映射为 VARCHAR | 不迁移 TYPE、TYPE BODY 对象;嵌套表等复杂对象不在同步范围内,启动前核对生成的目标列定义。 |
未指定精度的 NUMBER 默认映射为 DECIMAL(38,18),该映射不覆盖 Oracle NUMBER 的全值域,源端值域可能超出自动生成的目标类型。对负 scale、scale 大于 precision、超过目标 precision 上限,或增量转换中 scale 大于 18 的数值定义,先调整目标列并验证精度,不要直接使用自动转换结果。裁剪 NUMBER(p,s) 的 scale 不属于无损转换:源端允许 s>p 的定义,直接裁剪后可能丢失有效小数。
CLOB、NCLOB、XML 等转为 VARCHAR 后须满足目标字段大小限制。目标类型范围、VARCHAR 大小及时间精度见基础数据类型。BFILE 的外部文件内容和任意用户自定义类型不在自动同步范围内。
准备工作
准备用于采集和写入的数据库账号。
数据库 库表结构同步 全量同步 增量同步 自建 Oracle 待同步 Schema 的 Owner 权限及所需元数据访问权限。 待同步 Schema 的 Owner 权限及读取权限。 按 Oracle 版本、架构执行 DTS 要求的精细化授权,覆盖日志和数据字典访问。 AnalyticDB MySQL 3.0 目标数据库读写权限,能够创建目标对象。 目标数据库读写权限。 目标数据库读写权限;启用 DDL 时能够执行对应结构变更。 Oracle 侧授权见 Oracle 数据库账号准备,目标库账号配置见 AnalyticDB MySQL 数据库账号配置。按 Oracle 版本和架构执行对应授权。
包含增量同步时,开启归档日志和补充日志,并执行以下查询检查生效结果。
SELECT log_mode, supplemental_log_data_min, supplemental_log_data_pk, supplemental_log_data_ui FROM v$database;日志配置、不同版本的授权及 RAC、PDB 接入方法见 Oracle 数据库的限制和准备工作。本示例不覆盖 RAC 节点切换后的自动恢复。
配置网络访问。源库和目标库均需允许对应地域的 DTS 服务器访问,配置方法见添加 DTS 服务器的 IP 地址段。
检查源端字段的实际类型、值域、字符集、时间精度及目标主键。对含特殊精度或动态默认值的表,先按下文选择目标表创建方式准备兼容的目标表,再选择全量同步和增量同步。
选择目标表创建方式
目标表可以由 DTS 通过库表结构同步自动创建,也可以预先手工创建后关闭库表结构同步。目标表不应保留 SYSDATE、SYSTIMESTAMP、CURRENT_TIMESTAMP、序列或 UUID 生成函数等动态默认值;源端已生成的值随记录同步,不得由目标端重新生成。
| 情形 | 推荐路径 |
| 需要初始化目标数据,且表不含动态默认值和下表所列特殊定义 | 在同步类型中选择库表结构同步和全量同步,由 DTS 生成目标结构。 |
| 表含函数或表达式默认值 | 此类定义不属于自动 DDL 的可靠适用范围。预先创建符合类型和主键要求、且不含动态默认值的目标表,再关闭库表结构同步;任务期间请勿通过增量 DDL 引入此类默认值。 |
字符串默认值中含类型声明形式的文本(例如 numeric(2,5)) | 自动结构转换可能改写该文本。预先核对常量默认值,并预先创建目标结构、取消库表结构同步。 |
| NUMBER 定义为负 scale、scale 大于 precision、超过目标 precision 上限,或增量转换中 scale 大于 18 | 先调整目标列并验证精度,再关闭库表结构同步;不要直接使用自动转换结果。 |
| 需要复用已建好的目标表 | 在目标已存在表的处理模式中选择忽略报错并继续执行,并先核对结构、主键和现有数据。 |
无论选择哪条路径,启动前都必须核对目标列类型、主键列、分布键和分区信息,核对位置见操作步骤第 5 步。
操作步骤
本示例的源库为阿里云 ECS 上的自建 Oracle 数据库(非 RAC 实例),目标为 AnalyticDB MySQL 3.0 集群。
进入目标地域的同步任务列表。
通过 DTS 控制台进入:登录数据传输服务 DTS 控制台,在左侧选择数据同步,切换至任务所属地域。
通过 DMS 控制台进入:登录 DMS 控制台,在顶部菜单中选择 Data + AI > 数据传输(DTS) > 数据同步,再选择任务地域。
单击创建任务。
配置源库及目标库信息。填入便于识别业务和同步方向的任务名称,再按下表配置源库和目标库参数。
警告配置前核对本场景的类型映射和 DDL 限制。源库可执行某项 SQL,目标端不一定保留相同语义。
类别 配置 说明 源库信息 选择已有连接信息 已保存连接时可直接选择;否则手动填写以下信息。 源库信息 数据库类型 选择 Oracle。 源库信息 接入方式 本示例选择 ECS 自建数据库。其他部署方式按实际网络选择,并先完成对应准备工作。 源库信息 实例地区 选择源数据库所在地域。 源库信息 ECS 实例 ID 选择运行源数据库的 ECS 实例。 源库信息 端口 填入实际服务端口。Oracle 默认端口为 1521。 源库信息 Oracle 类型 选择非 RAC 实例,并填写实际 SID。RAC 或 PDB 实例需选择对应类型并填写 Service Name,且先完成对应接入准备。 源库信息 数据库账号、数据库密码 填入已按准备工作授权的源库账号及密码。 目标库信息 数据库类型 选择 AnalyticDB MySQL 3.0。 目标库信息 接入方式 选择云实例。 目标库信息 实例地区 选择目标集群所属地域。 目标库信息 实例 ID 选择接收数据的目标集群。 目标库信息 数据库账号、数据库密码 填入具备目标读写及所需 DDL 权限的账号和密码。 单击测试连接以进行下一步。此时如弹出 DTS 服务器访问授权对话框,核对源库和目标库的网络授权(授权方法见准备工作第 3 步)后,单击测试连接;未弹出该对话框时直接进入下一步。
配置任务对象。
a. 在对象配置页面设置同步类型。增量同步为固定选中项,在此基础上按场景勾选其余两项。
从零初始化目标数据:同时选择库表结构同步和全量同步。
已按上文预先创建目标表:不选择库表结构同步。
目标表已有基线数据、仅接收增量:不选择库表结构同步和全量同步,并自行保证起始位点与目标基线一致。
在同一页面设置其余参数。
配置 说明 目标已存在表的处理模式 默认使用预检查并报错拦截。确需复用已建好的目标表时,选择忽略报错并继续执行,并先核对结构、主键和现有数据。 源库对象 选择待同步的普通表,移动到已选择对象。按库或 Schema 选择时,同样需排除不受支持的对象。 已选择对象 按需配置对象名称映射、列选择和过滤条件。主键列不得被排除。设置方法见库表列名映射和设置过滤条件。 实例级别选择所需同步的 DDL 和 DML 仅选择本文支持的 SQL 操作。需要接收新建表时,新表须落入对象选择范围,不能仅勾选 CREATE TABLE 而未配置相应对象范围。 警告忽略报错并继续执行仅跳过同名表检查,不保留目标已有记录。本链路全量与增量写入均可能替换同主键记录,结构不一致还可能导致写入失败。先备份需保留的目标数据。
b. 单击下一步高级配置,按业务需要配置高级参数。
配置 说明 选择调度该任务的专属集群 使用共享集群时无需选择;已购买专属集群时,可选择相应集群。 源库、目标库无法连接后的重试时间 根据故障恢复目标设置连接重试窗口,并保证源日志覆盖重试及追赶所需时间。 源库、目标库出现其他问题后的重试时间 配置非连接错误的重试窗口,应小于连接重试窗口。不能依赖重试补齐已被过滤的 DDL。 是否限制全量同步速率 需要全量同步时,按源库读负载和目标写入能力设置 QPS、RPS、BPS。 是否限制增量同步速率 按实际写入能力设置限速,避免持续限速导致日志积压。 环境标签 按业务需要设置。 配置 ETL 功能 本示例选择否。 监控告警 建议配置任务失败和延迟告警,并填写告警联系人。 c. 单击下一步数据校验,该页面在高级配置之后出现。如页面提供校验配置项,按需创建校验任务;涉及类型转换时,针对关键字段、主键、行数和数据精度创建校验。无论是否启用自动校验,都必须完成上述核对。
d. 选择了库表结构同步时,下一步配置库表字段页面在数据校验之后出现。在该页面核对目标列类型、主键列、分布键和分区信息,主键及分布规则必须满足 CREATE TABLE 要求。该核对是启动前的必做项,预先建表的任务同样必须完成。
单击下一步保存任务并预检查。预检查失败或出现警告项时,按下文异常处理中的对应说明处理后再启动任务。
预检查通过后,单击下一步购买,配置资源组和链路规格。数据同步实例还需选择计费方式;包年包月实例需设置订购时长。核对订单和服务条款后,单击购买并启动,在确认对话框中单击确定。
结果验证
任务启动后,从以下三个方面确认同步生效。
阶段进度:在数据同步列表查看任务所处的同步阶段。
结构与数据:结合任务日志核对结构处理及数据写入结果,并核对目标表的列类型、主键列、分布键和分区信息,以及关键字段的行数和数据精度。被跳过的 DDL 会记录告警日志,不能仅凭任务处于运行中判断 DDL 已执行成功。
持续巡检:持续检查任务状态、同步延迟、源日志保留和目标磁盘空间。
异常处理
预检查未通过
单击对应项目的查看详情,修复权限、连接、对象或结构问题后重新检查。对警告项,先确认影响,再决定是否屏蔽;主键缺失、类型不兼容和日志不满足要求等问题,不得通过屏蔽告警继续运行。预检查通过不代表所有实际数据边界和业务 DDL 已被验证。
运行中的告警与被跳过的 DDL
部分不支持的 DDL 会被跳过并记录告警。检查任务日志,核对主键、列类型和目标数据。源端执行受支持的 DDL 后,核对目标实际结构及后续 DML;对被跳过的 DDL,先处理结构差异,再继续业务变更。
停止与释放同步链路
停止使用同步链路时,结束或释放 DTS 实例。任务停止后再调整日志保留策略,避免影响其他采集任务。