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