本文中的 OceanBase 指 OceanBase Oracle 模式租户。NineData 当前支持 Oracle 源端版本为 23ai、21c、19c、18c、12c 或 11g;目标端 OceanBase Oracle 模式,当前版本已适配 OceanBase V4.0。实际支持的数据库版本、对象类型和数据类型,以 NineData 持续更新的官方文档及任务预检查结果为准。
一、Oracle 迁移到 OceanBase的场景
Oracle 到 OceanBase 的迁移通常用于:
- 数据库国产化替代;
- 商业数据库成本优化;
- 数据库上云或跨云迁移;
- 业务系统扩容;
- 数据库版本升级;
- 生产库容灾和多活建设;
- Oracle 资源整合和架构改造。
OceanBase 提供 Oracle 模式,可以兼容部分 Oracle 使用习惯和 SQL 语法。但兼容模式不等于两个数据库完全等价。迁移时还是需要重点评估表结构、数据类型、索引、分区、序列、视图、触发器、存储过程、Package、Job 以及应用 SQL。
如果只做一次性导出导入,源库在迁移期间产生的新数据、更新和删除无法自动进入目标库。因此,生产迁移一般采用:
二、NineData 解决什么问题
NineData 数据复制支持通过复制任务组织 Oracle 到 OceanBase Oracle 模式的迁移流程,主要包括:
- 结构复制;
- 全量数据复制;
- DML 增量数据复制;
- DDL 增量数据复制;
- 任务状态和复制延迟监控;
- 数据一致性对比;
- 差异处理和重新同步;
- 异常告警;
- 迁移后的持续同步。
NineData 支持全对象类型的 DML 和 DDL 增量数据复制。这代表NineData 具备捕获和处理增量 DML、DDL 变更的产品能力。
需要区分的是:
- 产品能力:NineData 支持 DML/DDL 增量复制,能够捕获源端变更并写入目标端。
- 异构兼容性:某一条 Oracle DDL 是否能在 OceanBase Oracle 模式中完全等价执行,需要结合数据库版本、对象类型和目标端语法进行验证。
迁移团队仍需要负责对象兼容性评估、应用 SQL 改造和最终割接决策。
三、迁移前必须确认的前置条件
1.确认目标端为 OceanBase Oracle 模式
创建目标数据源时,应确认使用的是 OceanBase Oracle 模式租户,而不是 MySQL 模式租户。
需要记录:
- OceanBase 集群版本;
- 租户模式;
- 租户字符集;
- 目标 Schema;
- 连接地址和端口;
- 租户 CPU、内存和磁盘资源;
- 目标端账号权限;
- 是否通过代理、专线或私网连接。
Oracle 到 OceanBase MySQL 模式和 Oracle 模式的迁移方法不同,不能混用对象映射和数据类型规则。
2.准备 Oracle 增量日志
增量复制需要读取 Oracle 事务日志。实施前应完成源端检查,包括:
- Oracle 日志模式;
- Redo 和归档日志可访问性;
- 补充日志配置;
- 日志保留时间;
- 归档空间;
- 源端账号权限;
- 迁移期间日志是否可能被提前清理。
日志保留时间需要覆盖:
如果任务需要读取的归档日志已经被清理,增量任务可能无法从原位置继续。
3.主键或唯一约束是同步前提
NineData 要求,同步对象中的每张表应具有主键或唯一约束。
主键或唯一约束用于:
- 唯一定位更新记录;
- 定位删除记录;
- 避免重试时产生重复数据;
- 处理增量事件;
- 执行差异对比和修复。
因此,迁移前必须生成无主键、无唯一约束表清单。
对于无主键表,应采取以下方式之一:
- 增加合适的主键;
- 为确实唯一的字段增加唯一约束;
- 将该表排除在 NineData 增量复制范围之外;
- 采用一次性导入或其他经过验证的迁移方式。
4.准备目标端账号和网络
确认:
- NineData 可以访问 Oracle 和 OceanBase;
- 防火墙、安全组和白名单已放行;
- 源端账号具备日志和数据读取权限;
- 目标端账号具备创建对象或写入数据的权限;
- 目标端磁盘和租户资源充足;
- 目标端没有其他业务或同步任务同时写入。
实际权限按照迁移的实际需求授予,不建议直接授予不必要的全局高权限。
四、Oracle 对象转换怎么做
Oracle 到 OceanBase 的对象转换不能只看表和字段,还要建立完整的对象清单。NineData 预检查会根据当前复制链路、所选对象和任务配置检查部分连接、权限、对象及兼容性问题。预检查未通过的项目必须处理;标记为“警告”的项目需要结合实际业务进行人工确认。
需要盘点的对象
- 表
- 主键和唯一约束
- 普通索引
- 分区表
- 序列
- 视图
- 物化视图
- 同义词
- 触发器
- 存储过程和函数
- Package
- DB Link
- Job
- 用户、角色和权限
对象处理建议
表、字段和索引
重点关注:字段类型、字段长度、数值精度、默认值、NULL 属性、字符长度语义、索引字段顺序、分区键和分区策略。NineData 预检查会识别数据类型不兼容的字段,但字段语义是否等价仍需人工确认。
物化视图
Oracle 和 OceanBase 链路条件下,NineData 复制任务暂时不支持物化视图的复制、创建或持续维护。物化视图需要单独处理:OceanBase Oracle 模式虽然支持物化视图,但刷新方式和查询语句存在兼容限制。源端物化视图应在目标端人工重建或改造。
序列
迁移时需要记录序列当前值、步长和缓存配置。正式切换前应确认 OceanBase 中的序列值不会小于业务已经使用的最大值,否则可能产生主键冲突。
触发器
OceanBase Oracle 模式支持触发器。但在 NineData 增量同步场景下,目标端触发器的触发逻辑会在 NineData 写入数据时被执行。如果触发器产生了额外的数据变更,可能与同步逻辑叠加,造成预期外的结果。迁移前应确认目标端触发器在同步写入场景下是否需要保留或禁用。
存储过程、函数和 Package
OceanBase 兼容大部分 Oracle PL 功能,但不支持条件编译。PL/SQL 对象的兼容性以目标端编译结果为准,编译报错项即需改造的对象清单。
对象分类建议
将盘点结果分为四类:
点击图片可查看完整电子表格
关于结构对比的说明:NineData 结构对比功能暂不支持 Oracle 到 OceanBase Oracle 这条链路,该链路仅支持数据对比和增量对比。因此,对象转换的核验仍需通过预检查结果和人工检查完成。
五、重点数据类型转换
数据类型转换 NineData 结构复制会自动完成映射。实施中需要额外验证的是 OceanBase 明确不支持或行为有差异的类型。
OceanBase 明确不支持的类型
- LONG:OceanBase 不支持,需在迁移前改造为 CLOB
- LONG RAW:OceanBase 不支持,需改造为 BLOB
- NCLOB:OceanBase 不支持在用户表中创建 NCLOB 列。迁移时由 NineData 或 OMS 等工具将 NCLOB 列转换为 CLOB 进行存储和同步。应用侧若涉及 NCLOB 相关函数(如 TO_NCLOB),需要在目标端验证是否可用。
需要验证行为差异的类型
- DATE 范围:Oracle 支持公元前 4712 年至公元 9999 年,OceanBase 仅支持 0001-01-01 至 9999-12-31。存在公元 1 年之前日期的表需要单独评估。
- 空字符串与 NULL:Oracle 中空字符串等于 NULL,OceanBase Oracle 模式的行为与 Oracle 一致——插入空串 '' 时会自动转换为 NULL 存储,查询时需要用 IS NULL 而不是 = ''。但应用 SQL 中的空串比较逻辑仍需用真实数据验证,确认迁移后行为符合预期。
实际兼容性以 NineData 预检查结果为准。
六、使用 NineData 创建迁移任务
第一步:创建数据源
在 NineData 控制台中创建:
- Oracle 源数据源;
- OceanBase Oracle 模式目标数据源。
完成后分别执行连接测试。
第二步:选择复制类型
完整迁移通常选择:
- 结构复制;
- 全量复制;
- 增量复制。
如果目标端结构已经由人工创建,可以根据实际情况不启用结构复制,但必须确认目标端结构与 NineData 写入要求一致。
第三步:设置目标端处理策略
如果目标端已有对象或数据,需要提前决定:
- 使用已有对象;
- 删除并重建对象;
- 清空目标表;
- 保留目标端数据;
- 遇到冲突时报错;
- 使用源端数据覆盖目标端。
生产环境不建议让应用同时写 Oracle 和 OceanBase。双端写入会增加主键冲突、数据覆盖和回退难度。
第四步:选择同步对象
建议按业务域、Schema 或重要程度分批迁移,先从测试库、小规模表和非核心业务开始。
需要明确:
- 源 Schema 到目标 Schema 的映射;
- 是否排除临时表、日志表和历史表;
- 是否进行字段过滤;
- 是否进行行过滤;
- 大表是否单独迁移;
- 无主键表是否已经治理或排除;
- 目标端是否存在同名对象。
第五步:执行预检查
重点处理:
- 日志条件不满足;
- 账号权限不足;
- 无主键或无唯一约束表;
- 目标端对象已存在;
- 字段和数据类型不兼容;
- 目标端空间不足;
- 网络不稳定;
- 对象不在支持范围内。
预检查通过后,再启动正式复制。
七、执行全量复制
全量复制期间,NineData 将 Oracle 中已有数据写入 OceanBase,同时继续处理源端产生的增量变化。
Oracle 侧监控
- CPU;
- IO;
- 活跃会话;
- 归档日志增长;
- 锁等待;
- 业务响应时间;
- 归档空间。
OceanBase 侧监控
- 租户 CPU 和内存;
- 磁盘空间;
- 写入响应时间;
- 租户资源是否达到上限;
- 热点表或热点分区;
- 索引维护压力;
- 唯一键冲突。
NineData 侧监控
- 全量复制进度;
- 复制速率;
- 增量延迟;
- 失败对象;
- 当前执行线程;
- SQL 和提交响应时间;
- 任务日志。
建议先用较低并发测试,再逐步提高复制速度。迁移速度不能以牺牲源库业务稳定性为代价。
八、DML 和 DDL 增量同步
NineData 支持全对象类型的 DML/DDL 增量数据复制。
DML 增量
DML 主要包括:
- INSERT;
- UPDATE;
- DELETE。
NineData 会持续捕获源端变更并写入 OceanBase。主键或唯一约束是稳定定位记录的前提。
DDL 增量
DDL 可能包括:
- 新增字段;
- 删除字段;
- 修改字段;
- 新建或删除索引;
- 修改约束;
- 表结构变化;
- 对象创建或删除。
但 DDL 的“可捕获、可复制”不等于“所有 Oracle DDL 都能在 OceanBase 端完全等价执行”。以下变更仍需在测试环境验证:
- 修改字段类型;
- 修改主键;
- 修改分区;
- 表重命名;
- 字符集变更;
- 复杂视图;
- 触发器;
- 序列;
- Package 和 Job。
生产迁移期间仍建议冻结非必要 DDL。必须执行时,应先确认当前 NineData 链路、Oracle 版本和 OceanBase 版本的兼容性,再检查任务状态和目标端结构。
九、数据一致性校验
数据复制任务运行正常,并不等于源端和目标端已经完全一致。建议分层校验。
1.对象校验
比较:
- 表数量;
- 字段数量;
- 主键数量;
- 唯一约束数量;
- 索引数量;
- 分区数量;
- 序列和视图数量;
- 对象有效状态。
2.快速数据校验
检查:
- 表行数;
- 数值字段最大值、最小值和平均值;
- 抽样记录;
- 空值数量;
- 关键业务汇总值。
3.全量数据对比
对订单、账户、库存、支付和余额等关键表,建议执行全量数据对比。
NineData 数据对比支持配置:
- 对比并发;
- 自动或手动分片;
- 每个分片的记录数;
- 差异明细数量;
- 浮点数精度;
- 大字段是否参与对比;
- 字符串空格处理方式。
4.增量数据对比
对于增量同步期间产生的新增、更新和删除记录,还应检查:
- 是否存在漏同步;
- 是否存在重复写入;
- 是否存在目标端冲突;
- 字段值是否一致;
- 删除操作是否正确执行。
差异修复 SQL 执行前,需要检查外键、唯一约束、执行顺序和业务影响。
十、应用兼容性测试
迁移前应使用真实或接近真实的业务流量测试:
- JDBC 或其他连接驱动;
- 连接池;
- SQL 语法;
- 绑定变量;
- 分页查询;
- 序列;
- 存储过程;
- 临时表;
- 事务隔离;
- 锁等待;
- 大字段读写;
- 批量写入;
- 执行计划;
- 核心接口响应时间。
建议建立兼容性问题清单:
点击图片可查看完整电子表格
十一、低停机业务切换步骤
全量复制完成、增量延迟为0秒,并不代表可以直接切换。源端只要继续写入,就可能立即产生新事务。
切换前检查
确认:
- 结构复制完成;
- 全量复制完成;
- 增量任务稳定;
- 无失败对象;
- 数据对比通过;
- 核心接口验证通过;
- 序列值已经检查;
- OceanBase 资源充足;
- 应用连接配置已经准备;
- 回退方案已经演练。
正式切换
- 停止批处理、Job 和消息消费者。
- 将业务设置为只读,或暂停 Oracle 写入。
- 等待未提交事务完成。
- 等待 NineData 增量延迟降至0秒。
- 执行最终数据对比。
- 切换应用连接到 OceanBase。
- 重启或刷新连接池。
- 执行登录、查询、写入和核心交易测试。
- 恢复业务写入。
- 持续观察应用错误率、慢 SQL、锁等待和同步状态。
“低停机”是指迁移和追平期间业务可以持续运行,最终只需要较短的写暂停和连接切换时间,并不代表所有场景都绝对零停机。
十二、回退方案
如果业务切换到 OceanBase 后发现兼容性或性能问题,直接把连接切回 Oracle,可能导致切换期间产生的数据丢失。
回退设计应明确:
- 回退触发条件;
- 回退负责人;
- OceanBase 新数据如何回流;
- 是否建立并验证 OceanBase 到 Oracle 的反向复制;
- 如何避免双向同步循环;
- 回退前是否暂停写入;
- Oracle 如何追平;
- 回退后的数据校验方式;
- 源库保留时间。
NineData 支持 OceanBase 到 Oracle 的反向增量同步,可将业务切换到 OceanBase 后产生的新增数据实时回流至 Oracle,用于业务异常时快速回切。回退链路应在割接前配置并验证。
十三、常见故障处理
增量延迟升高
检查:
- Oracle 是否产生大事务;
- OceanBase 是否写入变慢;
- 网络是否抖动;
- 目标端是否资源不足;
- 是否存在主键或唯一键冲突;
- 是否发生了不兼容 DDL;
- 任务是否被限速。
日志读取位置不可用
如果归档日志已经清理,任务可能无法从原位置继续。应根据缺失时间段和目标端状态,评估重新全量复制、重新同步相关表或使用备份补齐。
目标端出现冲突
确认目标端是否被其他业务写入,检查目标表已有数据及主键策略。不要在未确认数据来源时直接覆盖。
数据对比不一致
建议依次执行:
- 确认两端是否仍有写入;
- 重新执行对比;
- 判断缺失、重复或字段值差异;
- 查看任务日志;
- 少量差异使用审核后的修复 SQL;
- 大范围差异重新同步相关表;
- 修复后再次校验。
十四、实施交付清单
建议至少准备以下材料:
- 源端和目标端环境清单;
- NineData 账号和权限清单;
- Oracle 日志配置检查表;
- 迁移对象清单;
- 无主键表清单;
- 对象转换清单;
- 数据类型映射表;
- 目标端资源评估;
- NineData 任务配置记录;
- 预检查问题处理记录;
- 数据一致性报告;
- 应用兼容性测试报告;
- 性能压测报告;
- 切换操作手册;
- 回退操作手册;
- 切换后观察记录。
总结
Oracle 到 OceanBase Oracle 模式迁移的关键,不是单纯完成一次数据导入,而是建立完整的复制和验证闭环。
NineData 提供了 Oracle 到 OceanBase Oracle 模式的数据复制链路,并支持结构复制、全量复制以及 DML/DDL 增量数据复制。
实施过程中最需要提前解决的是:
- 无主键表不能直接纳入正式增量同步;
- Oracle 日志和权限必须满足增量复制要求;
- 对象和数据类型需要逐项验证;
- NineData 具备 DDL 增量复制能力,但异构执行仍需验证;
- 增量延迟为0秒后仍应执行短暂写暂停和最终校验;
- 正式切换前必须准备可执行的回退方案。
只有将 NineData 的复制能力与对象治理、应用改造、数据校验和切换演练结合起来,才能完成一套真正可落地的 Oracle 到 OceanBase 迁移方案。
常见问题
Oracle 可以直接迁移到 OceanBase 吗?
可以迁移到 OceanBase Oracle 模式,但需要完成版本、对象、数据类型、应用 SQL 和性能兼容性评估。
NineData 支持 Oracle 到 OceanBase 的增量同步吗?
支持。NineData 支持全量复制和增量复制,并支持全对象类型的 DML/DDL 增量数据复制。具体能力以当前版本文档和预检查结果为准。
无主键表能否通过测试后继续同步?
不建议这样理解。NineData将主键或唯一约束列为同步前提。无主键表应先治理、排除或采用其他经过验证的迁移方式。
迁移期间可以继续写 Oracle 吗?
全量和增量追平期间可以继续提供业务服务。最终切换阶段建议短暂暂停写入,等待增量追平并完成最终校验。
DDL 能否自动从 Oracle 同步到 OceanBase?
NineData 具备 DDL 增量复制能力,但具体 DDL 在 OceanBase Oracle 模式中的执行结果仍取决于对象类型、数据库版本和兼容性。生产环境应先测试,迁移窗口内冻结非必要 DDL。
增量延迟为0秒后能否立即切换?
不建议立即切换。应先暂停写入、等待未提交事务完成、执行最终对比,再切换应用连接并完成业务验证。
官方参考资料
- NineData:Oracle 到 OceanBase Oracle 模式
- NineData:数据复制文档
- NineData:数据对比文档
- NineData 官方网站
- OceanBase 官方文档
- Oracle Database 官方文档