摘要:本文记录了一次真实的生产环境 Oracle 替换为 OceanBase 数据库的完整迁移方案。重点解析 OMS 反向增量(Reverse Incremental)作为回滚保障机制的工作原理、先决条件、隐藏列风险、停服迁移配置要点,以及正向切换的全流程操作。适合准备进行类似迁移的 DBA 和架构师参考。


一、业务场景与迁移策略

1.1 我们的场景

  • 源库:Oracle 19C,承载核心业务数据
  • 目标库:OceanBase Oracle 模式租户
  • 迁移方式停服迁移(在停服窗口内完成切换)
  • 回滚保障:OMS 反向增量,确保 OB 出问题时可回退至 Oracle
  • 同步频率:正向切换后每日同步一次,稳定运行 3~6 个月后降至每周一次

1.2 为什么不是实时同步?

我们的场景是停服迁移,不需要 7×24 实时同步。反向增量的定位是"回滚保险"而非"实时数据通道":

阶段 频率 回滚丢失量 说明
正向切换后 0~3 个月 每日一次 最多 1 天 OB 初上线,稳定性待观察
稳定运行 3~6 个月后 每周一次 最多 1 周 OB 已稳定,团队运维成熟
长期稳定后 按需或停止 - 完全信任 OB,回滚需求极低

二、OMS 迁移类型概览

在 OMS 中创建迁移任务时,需要勾选以下迁移类型(同一个任务中一次性全部勾选):

迁移类型 作用 是否必须
结构迁移 迁移表、索引、约束、视图等对象定义
全量迁移 迁移存量数据
增量同步 同步数据变更(INSERT/UPDATE/DELETE)
全量校验 对比源端和目标端数据一致性
反向增量 正向切换后 OB 变更回流至 Oracle 是(回滚保障)

2.1 增量同步为什么必须勾选?

即使停服迁移也必须勾选增量同步,原因有三:

  1. 反向增量的前置依赖:反向增量复用增量同步的 DML 配置和组件,不勾选增量同步则无法启用反向增量
  2. 全量校验的前置条件:全量校验需要增量同步追平后才能发起
  3. 数据完整性兜底:停服窗口内仍可能有"尾巴"数据,增量同步确保真正的一致性

不停服 vs 停服场景的区别:两者都必须勾选增量同步,但同步频率不同——不停服场景按秒级实时追平,停服场景按需配置为每日/每周。


三、先决条件:表必须有唯一键

3.1 硬性要求

OMS 要求参与迁移的表必须具备唯一标识能力:

  • 有主键表:存在 Primary Key 或 NOT NULL Unique Key(不含 function-based UK)
  • 无主键表:OMS 通过在目标端(OB)新增隐藏列进行迁移

3.2 正向切换后隐藏列被删除:无主键表的风险

这是迁移中极易被忽视的一个坑。流程如下:

① 结构迁移:Oracle 无主键表 → OB
   OMS 在 OB 端自动添加隐藏列 + 唯一索引
   
② 正向切换:OMS 自动删除隐藏列和唯一索引
   OB 表恢复到"无唯一键"状态
   
③ 反向增量(OB→Oracle)时:
   OMS 无法定位行 → UPDATE/DELETE 全表扫描 → 性能极差 + 数据质量风险
   
④ 回滚:停止反向增量,应用切回 Oracle,最大丢失一个同步周期

正向切换时 OMS 会自动删除隐藏列和唯一索引。如果原 Oracle 表本来就没有主键,切换后 OB 表也没有唯一键,反向增量就无法正常工作了。

3.3 解决方案

最佳实践:迁移前审查所有表,为无主键表执行:

ALTER TABLE table_name ADD PRIMARY KEY (column_name);

如果确实无法添加主键:

  • 反向增量性能会受严重影响(全表扫描定位行)
  • 建议反向增量期间避免对无主键表做大批量 UPDATE/DELETE
  • 无主键且包含 LOB 类型字段的表,反向增量会出现数据质量问题

3.4 隐藏列加在哪里?

只在目标端(OB)添加,源库 Oracle 完全不受影响

OB Oracle 模式下添加的隐藏列包括:

OBS_OBJECT_NUMBER     -- 对象编号
OBS_RELATIVE_FNO      -- 相对文件号  
OBS_BLOCK_NUMBER      -- 块编号
OBS_ROW_NUMBER        -- 行号
+ 唯一索引 UK_<table>_OMS_ROWID

四、反向增量的工作原理

4.1 OMS 如何反向同步?

反向增量(OB → Oracle)的工作流程:

① Store 组件拉取 OB 增量日志(Clog)
② 解析 DML 变更,提取变更前后的行数据
③ JDBCWriter 根据唯一键(PK/UK)定位 Oracle 中的对应行
④ 执行 UPDATE/DELETE/INSERT 写入 Oracle

核心依赖:反向同步的每一步都依赖"按唯一键定位行"。没有唯一键就无法精确定位,只能退化为全表扫描,性能和数据一致性都无法保障。

4.2 完整的数据流向

Oracle(源库)  ←──── 反向增量(回滚保障,按日频率)  ←────  OceanBase(目标库/业务主库)
     ↑                                                              |
     └──────── 正向同步(全量迁移 + 增量同步) ───────────────────┘
  • 正向:Oracle → OB(全量迁移 + 增量同步)
  • 反向:OB → Oracle(回滚保障,按日/周频率)

4.3 不支持反向增量的场景

以下情况不支持配置反向增量,需要提前规避:

  • 多表汇聚(多个源表同步到一个目标表)
  • Schema 多到一映射
  • 容灾双活场景(自动处理,无需手动配置)
  • 表中全部列均为 LOB 类型(BLOB/CLOB/NCLOB)
  • Oracle 执行 UPDATE TABLE_NAME SET KEY = KEY + 1(KEY 为主键)

五、创建迁移任务的完整步骤

5.1 源端和目标端环境准备

Oracle 源端

  • 开启 archivelog,确保已切换过 logfile
  • 安装 LogMiner 工具
  • 归档日志至少保存 7 天(全量 + 增量场景)
  • 创建迁移用户并授权:SESSIONALTER SESSIONSELECT ANY TABLESELECT ANY DICTIONARY
  • 如需行过滤(非 PK/UK 列),开启补充日志:
ALTER TABLE table_name ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;

OceanBase 目标端

  • 提前创建对应的 Schema
  • 创建迁移用户并授权:CONNECTCREATE SESSIONSELECT ANY TABLECREATE ANY TABLECREATE ANY INDEXINSERT ANY TABLEUPDATE ANY TABLEDELETE ANY TABLE
  • 创建内部用户:
CREATE USER __OCEANBASE_INNER_DRC_USER;
GRANT ALL PRIVILEGES TO __OCEANBASE_INNER_DRC_USER;
  • OMS 中配置所属 OCP,否则增量同步和反向增量选项无法选择

5.2 创建迁移任务的五个步骤

步骤 1:登录 OMS 控制台 → 数据迁移 → 新建迁移任务

步骤 2:选择源端 Oracle 数据源和目标端 OB Oracle 数据源,配置任务名称

步骤 3:选择迁移类型(关键步骤

  • 「增量同步」必须勾选:反向增量的前置依赖
  • 「反向增量」必须勾选:回滚保障机制
  • 其他类型按需勾选

步骤 4:选择迁移对象(指定对象或匹配规则),支持列映射、行过滤、库表重命名

步骤 5:配置迁移选项,执行预检查,全部通过后启动任务


六、正向切换六步流程

正向切换是在停服窗口内完成的业务割接操作,包含六个步骤:

步骤 操作 说明
1 启动目标端 Store OMS 自动拉取 OB 增量日志,预计 3~5 分钟
2 确认源端停写 DBA 确认业务应用已停止写入 Oracle
3 确认同步追平停写位点 OMS 自动检查延迟,确认增量已追平
4 停止正向同步 停止 Oracle → OB 的写入
5 执行数据库对象处理 补充约束、禁用源端触发器/外键
6 启动反向同步 OB 变更按每日频率回流至 Oracle,Oracle 成为"冷备"

注意:正向切换流程进行时整个迁移任务不可暂停。切换前确保 Oracle 已停写,应用已切换到 OB。


七、同步频率调整策略

正向切换后,建议按以下策略逐步降低同步频率:

第一阶段(0~3 个月):每日同步

  • 反向增量和正向增量均按每日频率运行
  • 最大回滚数据丢失量:1 天
  • 适用:OB 初上线,稳定性待验证

第二阶段(3~6 个月后):每周同步

  • 反向增量频率降至每周
  • 最大回滚数据丢失量:1 周
  • 适用:OB 稳定运行,团队运维成熟

第三阶段(长期稳定):按需或停止

  • OB 完全稳定后可停止反向增量
  • 或改为按需手动同步
  • 适用:OB 成为核心生产库,回滚需求极低

降频决策依据:OB 稳定运行时长 + 团队运维成熟度 + 业务容忍的数据丢失量。建议每季度评估一次。


八、常见问题 FAQ

Q1:OB 稳定后反向增量可以停吗?

可以停,但建议保留一段时间作为保险。停掉前确保 OB 已稳定运行 3~6 个月,且团队已完全适配 OB 运维。

Q2:无主键表怎么迁移?

强烈建议迁移前 ALTER TABLE ADD PRIMARY KEY。如果确实无法添加,OMS 会使用隐藏列方案,但正向切换后隐藏列被删除,反向增量时会退化为全表扫描,性能和数据质量都有风险。

Q3:延迟时间显示不准确怎么办?

检查服务器时钟同步。节点间时钟不同步可能导致延迟显示为负数。

Q4:字符集不一致怎么办?

建议两端使用兼容字符集(UTF-8/UTF-16)。反向增量时可能出现数据超长无法写回源端的问题。

Q5:停服迁移也需要增量同步吗?

必须勾选。即使停服,增量同步也是反向增量的前置依赖,同时负责追平停服窗口内的"尾巴"数据。


九、最佳实践清单

  1. 迁移前统一为所有表添加主键,避免正向切换后反向增量出问题
  2. 创建任务时必须勾选:结构迁移 + 全量迁移 + 增量同步 + 全量校验 + 反向增量
  3. 割接前充分测试反向增量,验证按日频率同步的数据一致性
  4. Oracle 归档日志至少保留 7 天
  5. 停服窗口内执行正向切换,切换后持续监控每日同步状态
  6. OB 稳定 3~6 个月后反向增量可降频至每周,建议每季度评估
  7. 回滚操作:OB 出问题 → 停止反向增量 → 应用切回 Oracle → 最大丢失一个同步周期

十、总结

本次生产环境 Oracle 替换为 OceanBase 的迁移方案核心要点:

要点 说明
迁移方式 停服窗口内完成
回滚保障 OMS 反向增量,按日/周频率同步
核心前提 所有表必须有主键
增量同步 停服也必须勾选,是反向增量的前置依赖
正向切换 停服窗口内执行,自动启动反向增量
频率策略 每日 → 每周 → 按需/停止,逐步降频

核心公式:反向增量 = 回滚保险丝。一次配置,按频率自动运行,出问题随时切回 Oracle。



📎 配套资料下载

  • PPT 演示文稿点击下载(含完整图文操作流程)

适合团队内部培训、会议汇报使用

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐