Oracle 实时同步到 Doris 怎么做?全量迁移、CDC 增量复制与数据校验指南

举报
数据库技术 发表于 2026/10/13 16:10:10 2026/10/13
【摘要】 本文介绍如何使用 NineData 将 Oracle 实时同步到 Apache Doris,覆盖 Oracle 归档日志与附加日志配置、全量迁移、CDC 增量复制、Oracle 到 Doris 类型映射、Key 与 Distribute Key、同步延迟监控,以及全量和增量数据一致性校验。
Oracle 承载交易数据,Apache Doris 承载实时分析,是企业构建实时数仓时常见的异构数据链路。真正落地时,团队通常需要同时解决四个问题:如何把 Oracle 存量数据完整迁移到 Doris,如何持续捕获新增、更新和删除,如何处理两端数据类型与表模型差异,以及如何证明同步后的数据一致。

NineData 数据复制支持 Oracle 到 Doris 的结构复制、全量复制和增量复制。本文以一条完整的生产链路为例,说明准备条件、任务配置、CDC 原理、类型映射、监控和数据校验方法。

核心方案:先通过结构复制和全量复制建立 Doris 基线,再由增量复制读取 Oracle 日志并持续写入 Doris;任务追平后,通过全量或快速数据对比叠加增量数据对比,持续检查两端一致性。

一、Oracle 到 Doris 实时同步的整体链路


一条典型链路可以拆成四个阶段:

  1. 结构准备:将 Oracle 表结构转换为 Doris 可接收的结构,配置目标表名、Key 和 Distribute Key。
  2. 全量复制:读取 Oracle 已有数据,并行写入 Doris,建立目标端数据基线。
  3. CDC 增量复制:从 Oracle 日志中捕获 INSERT、UPDATE、DELETE 等变化,持续同步到 Doris。
  4. 数据校验:全量阶段完成或增量任务追平后,对源端和目标端执行一致性对比;任务持续运行期间,再校验新增、更新和删除记录。

这种方式适合以下场景:

  • 将 Oracle 业务库中的订单、客户、库存等数据实时同步到 Doris,供 BI、报表和即席分析使用;
  • Oracle 数据库迁移或下线前,先完成存量迁移,再保持增量数据持续追平;
  • 建设实时数仓,降低分析查询对 Oracle 生产库的影响;
  • 将分散在多个 Oracle Schema 中的数据汇聚到 Doris。

二、开始前必须满足的产品条件


NineData Oracle 到 Doris 链路创建任务前应确认以下条件。

1. 支持的 Oracle 源端版本


NineData 当前支持以下 Oracle 版本作为该链路的源端:

  • Oracle 23ai
  • Oracle 21c
  • Oracle 19c
  • Oracle 18c
  • Oracle 12c
  • Oracle 11g

目标端数据源类型为 Doris。Doris 的具体版本兼容性以 NineData 控制台创建数据源时的提示和最新更新为准;

2. Oracle 与 Doris 已添加到 NineData


在 NineData 控制台进入「数据源管理 > 数据源」,分别创建 Oracle 和 Doris 数据源。

1.PNG



Oracle 支持通过公网地址、NineData 网关或 SSH Tunnel 接入。连接信息包括 Oracle 地址、端口、SID 或 Service Name、数据库账号和密码。添加公网或自建环境中的 Oracle 时,需要将 NineData 对应接入地域的服务器 IP 加入 Oracle 白名单。

2.PNG



Doris 数据源需要填写 FE 节点的地址和端口。用于数据复制时,建议继续添加可访问的 BE 节点:NineData 可以直接向 BE 写入,提高数据导入效率;如果不配置 BE,也可以通过 FE 写入,但速度会较慢BE 节点配置使用主机名或 IP 及心跳端口,默认端口为 8040。

两端都应先执行「连接测试」,确认成功后再创建数据源。

3. 数据库账号权限


不同复制阶段的权限要求不同:

复制类型
Oracle 源端权限
Doris 目标端权限
结构复制
CONNECT、SELECT ANY DICTIONARY、SELECT ANY TABLE、SELECT_CATALOG_ROLE
目标数据库的全部权限
全量复制
CONNECT、SELECT ANY DICTIONARY、SELECT ANY TABLE、SELECT_CATALOG_ROLE
目标数据库的全部权限
增量复制
需要指定一个 DBA 权限用户,用于 Oracle 为源的增量数据复制任务
目标数据库的全部权限

生产环境应使用专门的同步账号,不要复用个人账号。账号授权应按照组织安全流程执行,并限制来源网络。Oracle 12c 及以上的 CDB/PDB 环境还要正确处理公共账号和容器权限,具体授权语句以 NineData 当前链路要求及企业 Oracle 架构为准。

4. Oracle 必须开启归档日志与附加日志


NineData 的 Oracle CDC 增量复制依赖源端日志。创建增量任务前,先检查日志模式和附加日志:

SELECT log_mode FROM v$database; SELECT supplemental_log_data_all AS allc FROM v$database;

预期结果如下:

  • LOG_MODE 为 ARCHIVELOG;
  • SUPPLEMENTAL_LOG_DATA_ALL 为 YES。

如果 Oracle 当前为 NOARCHIVELOG,需要先按照 Oracle 的标准流程切换到 ARCHIVELOG。该操作涉及实例状态与归档空间规划,应在维护窗口由 DBA 完成。

如果附加日志未开启,可以执行:

ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;

附加日志使 CDC 能够获得可靠的行定位和变更信息。开启后还应评估 redo 和归档日志增长量、磁盘容量及清理策略。

5. 每张同步表应具有主键或唯一约束


NineData 要求同步对象中的每张表具有主键或唯一约束,并保证列名唯一。缺少稳定的唯一标识时,增量更新和删除难以准确定位目标记录,可能造成重复同步或数据不一致。

在建任务前建议先盘点无主键表,对查询结果逐表评估:优先补充业务主键或唯一约束;无法补充时,不应在未验证的情况下直接纳入实时同步。

6. 对象名称必须符合 Doris 规则


Oracle 源端的库表名称需要符合 Doris 命名规则:以字母开头,只包含字母、数字和下划线,不能包含空格或其他特殊字符。

对于不符合规则的对象,可在 NineData 的映射配置中修改目标表名或使用批量规则统一转换。创建任务时也可以选择目标对象命名规则:全部转小写、保持与源一致或全部转大写。

三、在 NineData 中创建 Oracle 到 Doris 复制任务


登录 NineData 控制台,进入「数据复制 > 数据复制」,单击「创建复制」。

步骤 1:选择 Oracle 源端与 Doris 目标端

3.png



在「数据源与目标」页面配置:

  • 任务名称:使用便于识别的名称,例如 oracle_order_to_doris_realtime;
  • 源数据源:已录入的 Oracle;
  • 目标数据源:已录入的 Doris;
  • 目标对象命名规则:根据 Doris 现有规范选择大小写转换;
  • 复制类型:根据场景选择结构复制、全量复制和增量复制;
  • 复制规格:根据数据量、业务窗口和期望速度选择。

首次建设实时链路时,通常选择「结构复制 + 全量复制 + 增量复制」。这会先创建目标结构并迁移历史数据,然后持续同步 Oracle 日志中的变化。

如果 Doris 已由数仓团队提前建表,可以不选择结构复制,但目标库中的表名、列名必须与复制对象一致,或在后续步骤中手动建立映射。


步骤 2:设置增量开始时间


包含增量复制时,可以选择:

  • 从启动时间开始:以任务启动时间为增量起点;
  • 自定义时间:按业务时区选择历史时间点。

使用自定义历史时间时,要确保所需归档日志仍然可用。NineData 官方文档同时提示:如果起点早于任务创建时间,而该时间段内发生过 DDL,复制任务可能失败。因此,选择历史位点前应核对日志保留时间和 DDL 变更记录。

步骤 3:明确目标端存量与冲突处理策略


NineData 会根据所选复制类型展示不同策略。

4.png



目标库同名对象处理策略用于结构复制:

  • 预检查报错并停止任务;
  • 跳过并继续任务;
  • 删除对象并重建。

目标表存量数据处理策略用于全量复制:

  • 预检查报错并停止任务;
  • 忽略目标存量数据,追加写入;
  • 清空目标存量数据,重新写入。

目标表增量数据冲突处理策略用于增量复制:

  • 运行时报错,等待人工处理;
  • 不更新目标数据,跳过冲突并继续;
  • 更新目标数据,以源端变更覆盖目标端数据。

生产任务不应机械选择“覆盖”。如果 Doris 只作为 Oracle 的下游分析副本,通常应禁止业务直接修改目标表,再根据企业对一致性和连续性的优先级选择“报错”或“更新目标数据”。

步骤 4:选择复制对象


NineData 支持两种方式:

5.png



  • 全部实例:复制源端可选的全部内容;
  • 自定义对象:按 Schema 和表选择需要同步的对象。

生产实时数仓更建议使用自定义对象,只同步分析真正需要的表和字段,降低 Oracle 日志读取、网络和 Doris 写入压力。

如果需要批量创建多条相似链路,可以下载复制对象配置模板,通过 Excel 批量定义源表、目标表、源库、目标库、字段列表和额外配置,再上传导入。额外配置支持字段映射、目标字段类型、字段取值以及行级过滤条件。

步骤 5:配置 Oracle 到 Doris 的映射


在「配置映射」页面,需要重点检查以下内容:

  • 目标数据库和目标表名称;
  • Oracle 列名到 Doris 列名的映射;
  • Oracle 类型到 Doris 类型的转换结果;
  • Doris 目标表的 Key;
  • Doris 目标表的 Distribute Key;
  • 是否需要字段过滤或行过滤。

6.png


NineData 允许单击「映射与过滤」调整目标字段名和数据过滤条件。例如设置:

ORDER_ID >= 100000

仅符合条件的数据会写入 Doris。过滤条件应先在 Oracle 侧验证语义与执行成本,避免对源库造成意外压力。

对于大量表,可以使用「批量配置」统一处理表名、字段名大小写、前后缀和字符串替换。源端或目标端结构在配置期间发生变化时,应单击「刷新元数据」重新获取结构。

步骤 6:为 CDC 选择正确的 Doris 表模型


Doris 的表模型决定相同 Key 的多条记录如何保存。Oracle→Doris 链路包含 UPDATE 和 DELETE 时,表模型不能只按照查询性能选择,还要保证目标端能够表达源端变更语义。

Doris 表模型
相同 Key 数据的处理方式
对 Oracle CDC 的影响
典型用途
Duplicate Key
保留明细数据,不对相同 Key 自动去重或聚合
Oracle UPDATE 如果以新版本行写入,旧版本可能仍然存在;DELETE 也不能仅依赖追加一行自然消除旧记录。若要保存“当前状态”,需确认同步链路能够执行目标端更新和删除
原始明细、事件流、允许多版本记录的事实数据
Aggregate Key
相同 Key 的 Value 列按 SUM、MAX、MIN、REPLACE 等聚合方式合并
写入语义会被聚合函数改变,不天然等价于 Oracle 行级 UPDATE/DELETE;需要按指标模型设计并验证回撤或删除行为
预聚合指标、汇总报表
Unique Key
以 Key 保持逻辑唯一,新写入记录更新同 Key 的当前值
更接近 Oracle 主键表的“最新状态”语义,通常是承接行级 UPDATE/DELETE 的优先评估对象;仍需验证删除事件、部分列更新和乱序变更
订单、客户、库存等需要保留最新状态的表

如果目标是构建 Oracle 业务表的实时镜像,通常先评估 Unique Key 模型,并让 Doris Key 与 Oracle 主键或稳定唯一键一致。Duplicate Key 更适合保留所有事件或明细版本,Aggregate Key 更适合已经明确聚合口径的指标表。

上线前可以针对目标 Doris 版本、表模型和 NineData 写入路径,实际执行以下测试:

  1. 插入一个新主键,确认 Doris 只出现一条记录;
  2. 连续更新同一主键,确认最终值与 Oracle 一致且没有多版本重复;
  3. 删除该主键,确认 Doris 查询结果不再返回该记录;
  4. 对同一主键快速执行多次更新,验证事务顺序和最终状态;
  5. 在全量复制进行期间更新或删除记录,确认全量与增量衔接没有覆盖新值或复活已删除记录。

NineData 的 Oracle→Doris 配置映射页面支持配置目标表 Key 和 Distribute Key。Key 负责数据模型语义,Distribute Key 影响数据分布与写入/查询热点。两者都应以 Oracle 主键分布、表规模和主要查询条件为依据评审,避免使用高倾斜列作为分桶键。

四、Oracle 数据类型如何映射到 Doris


异构同步不能只关注“数据是否写入”,还要确认精度和语义是否保持。NineData支持的主要类型映射如下:

Oracle 类型
Doris 类型
CHAR、NCHAR
CHAR
VARCHAR2、NVARCHAR2
VARCHAR
CLOB、NCLOB、LONG
STRING
NUMBER、DECIMAL
DECIMAL
BINARY_FLOAT
FLOAT
BINARY_DOUBLE
DOUBLE
DATE、TIMESTAMP
DATETIME
TIMESTAMP WITH TIME ZONE、TIMESTAMP WITH LOCAL TIME ZONE
DATETIME
INTERVAL YEAR TO MONTH、INTERVAL DAY TO SECOND
VARCHAR
RAW
VARCHAR
BLOB、BFILE、LONG RAW
STRING
ROWID、UROWID
VARCHAR

长度和精度会根据源字段定义生成。映射成功不等于业务语义一定一致,建议对关键字段单独设计验证用例。


五、保存任务并执行预检查

7.png



完成映射后,单击「保存并预检查」。Oracle 到 Doris 链路的预检查包含:

  • 源数据源连接检查;
  • 目标数据源连接检查;
  • Oracle 源端账号权限检查;
  • Doris 目标端账号权限检查;
  • Oracle 是否为 ARCHIVELOG;
  • Oracle 是否开启 Supplemental Log (ALL);
  • Doris 目标表是否已有数据;
  • Doris 是否存在同名对象;
  • 对象名称是否符合 Doris 命名规范。

检查失败时,进入对应检查项的「详情」查看原因,修复后单击「重新检查」。警告项可以结合实际情况决定是否处理,但涉及权限、日志模式、对象命名和目标存量数据的警告,应明确风险后再继续。

8.png


预检查通过后,单击「启动任务」。NineData 会按照结构复制、全量复制、增量复制的顺序执行所选阶段。

9.png


六、全量迁移期间如何降低业务影响

全量复制会持续读取 Oracle 并向 Doris 写入。数据量较大时,应提前评估两端性能,并尽量在业务低峰期启动。

10.png


NineData 在任务详情的「全量复制」页签展示进度、日志和监控指标。全量复制过程中可以使用「限流设置」,按行/秒限制写入 Doris 的速率。实际限流值应结合以下指标逐步调整:

  • Oracle CPU、I/O、会话数与查询响应时间;
  • 网络带宽与丢包;
  • Doris FE/BE 负载、导入响应时间和 compaction 压力;
  • NineData 全量复制吞吐和预计完成时间。

    11.png


如果追求更高写入效率,确认 NineData 到 Doris BE 节点的网络连通性,并在 Doris 数据源中配置多个可访问的 BE 节点。

七、CDC 增量复制如何运行和监控


全量阶段建立基线后,NineData 增量复制持续读取 Oracle 日志,将变更写入 Doris。任务详情会展示同步延迟和增量复制监控。

12.png



增量阶段建议重点关注:

  • 同步延迟:显示 Oracle 与 Doris 之间的数据延迟;0 秒表示当前已追平;
  • 执行线程:查看线程号、当前执行 SQL、提交响应时间、事件时间和状态;
  • 写入限流:按行/秒限制增量写入速度;
  • 任务日志:排查权限、日志缺失、数据冲突和目标写入异常;
  • 告警:任务失败时按已配置的通知方式发送告警。

当提交响应时间持续升高或延迟不断累积时,应分别检查 Oracle 日志产生速度、归档可用性、网络、NineData 规格以及 Doris 写入和 compaction 状态,而不是只在目标端盲目扩容。

NineData 对部分增量任务提供同步位点管理,可以查看或修改读取位点和写入位点。修改位点会暂停并重启任务,错误调整可能导致数据丢失或两端不一致。该功能只应在完成备份、明确影响范围且具备回滚方案的维护窗口使用,已完成增量复制的任务不能重置位点。

八、如何校验 Oracle 与 Doris 数据一致性


仅看到任务“运行中”或延迟为 0 秒,为了确保数据完全一致,建议生产链路中同步完成至少一次基线校验,并对后续 CDC 变化持续抽查或对比。

13.png


1. 在复制任务中开启数据一致性对比


创建任务的预检查页面可以勾选「开启数据一致性对比」。不同任务的启动时机为:

  • 仅结构复制:结构复制完成后;
  • 结构复制 + 全量复制:全量复制完成后;
  • 仅全量复制:全量复制完成后;
  • 包含增量复制:增量数据首次追平源端且延迟为 0 秒时。

任务启动后,也可以进入复制详情的「数据对比」页签手动开启。

2. 全量数据对比与快速对比怎么选


该条数据链路,NineData 数据对比提供两种主要方式:

  • 全量数据对比:对所选数据进行完整对比,适合割接前的最终确认和核心表校验;
  • 快速对比:对比记录总数、数值列的最大值/最小值/平均值,并按设定比例随机抽样,适合大规模任务的快速巡检。

    14.png


数据对比支持设置并发数、是否分片、单分片大小、FLOAT/DOUBLE 精度、大字段是否参与对比以及字符串空格处理策略。大表可以启用分片并行,但应根据 Oracle 和 Doris 的负载逐步提高并发。

15.png


3. 如何控制数据校验对源库的影响


全量数据对比会读取所选范围的数据。表越大、并发越高、分片越多,通常完成越快,但对 Oracle 的 CPU、I/O、Buffer Cache、会话和网络压力也越大。生产环境建议采用以下顺序:

  1. 先用快速对比覆盖全部同步表,定位记录数和统计值异常;
  2. 对核心表、异常表和割接范围执行全量数据对比;
  3. 大表开启分片前,先用低并发和较大的单分片进行基线测试;
  4. 在业务低峰期逐步提高并发,同时观察 Oracle AWR/ASH、I/O、活动会话和业务 SQL 响应时间;
  5. 根据需要关闭大字段对比,或把大字段表拆到独立任务;
  6. 对 FLOAT/DOUBLE 设置符合业务容差的精度,避免把浮点表达差异误判为业务不一致;
  7. 实时链路稳定后启用增量对比,减少重复扫描历史数据。

对比任务的并发数和单分片大小没有适用于所有环境的固定值。应使用生产等规模数据压测,并以不突破源库资源水位和业务 SLA 为前提调优。

4. 数据对比

Oracle → Doris 链路支持全量数据对比,可用于校验迁移后两端的数据一致性。
使用条件包括:
  • 复制任务包含全量复制;
  • 待对比表具有主键、唯一键或可用于定位记录的普通索引。
在复制任务详情进入「数据对比」,选择全量对比执行校验。注意:该链路暂时不支持增量对比,无法对 CDC 产生的新增、更新、删除记录进行持续校验,可以关注产品的持续迭代和更新进度。

5. 如何处理不一致


对比结果不一致时,可以查看:

  • 记录在 Oracle 和 Doris 中是否存在;
  • 用于定位记录的主键、唯一键或索引;
  • 两端字段值;
  • 差异记录数。

差异明细可以下载为 JSON 或 Excel。文件可能包含敏感业务数据,应按照企业的数据安全制度保存和传输。

NineData 可以根据差异生成变更 SQL。页面最多展示 1000 条差异,全部语句可通过变更文件下载。变更 SQL 会直接修改目标数据,不能未经审核批量执行。对于同一主键的数据差异,可能需要先删除错误记录再插入正确记录;执行前应检查目标、条件、顺序和事务策略,完成后重新对比确认结果恢复一致。

九、迁移割接前的检查清单


当 Oracle 到 Doris 用于正式迁移或分析流量切换时,建议至少完成以下检查:

  1. Oracle 与 Doris 数据源连接稳定,白名单和网关配置符合生产要求;
  2. Oracle 版本在支持范围内,源端已开启 ARCHIVELOG 和 Supplemental Log (ALL);
  3. 所有同步表具有主键或唯一约束,列名唯一;
  4. 表名、列名符合 Doris 规则,Key 和 Distribute Key 已评审;
  5. 金额、时间、大字段和特殊类型的映射已经过边界值验证;
  6. 目标端存量数据和增量冲突策略已经明确;
  7. 全量复制完成,失败对象为零,相关日志无未处理异常;
  8. 增量复制持续运行并追平,延迟稳定为 0 秒或满足业务 SLA;
  9. 全量或快速数据对比完成,核心表结果一致;
  10. 增量数据对比已覆盖真实的 INSERT、UPDATE、DELETE 测试;
  11. 任务失败告警、归档日志保留、Doris 容量和应急处理方案已经配置;
  12. 如果涉及业务切换,已准备回退方案,并冻结或严格管理切换窗口内的 DDL。

十、常见问题


Oracle 到 Doris 可以只做一次全量迁移吗?


可以。创建任务时选择结构复制和/或全量复制,不选择增量复制即可。如果需要 Oracle 后续变化持续进入 Doris,则应选择增量复制,并提前开启 Oracle 归档日志和附加日志。

CDC 是否需要在 Oracle 表上增加时间戳字段?


不需要依赖业务时间戳字段轮询。NineData 的 Oracle 增量复制基于源端日志捕获变化。但同步表仍应具有主键或唯一约束,以可靠定位更新和删除记录。

为什么 Oracle 开启了 ARCHIVELOG,预检查仍然失败?


除 ARCHIVELOG 外,还要确认 SUPPLEMENTAL_LOG_DATA_ALL 为 YES,同步账号权限满足要求,且 NineData 能访问相应 Oracle 实例。可以从预检查详情查看具体失败项。

Doris 是否必须配置 BE 节点?


不是必须。NineData 可以通过 FE 写入 Doris,但官方文档说明配置 BE 后可以直接向 BE 写入,效率更高,并建议添加所有可正常访问的 BE 节点。

增量延迟为 0 秒是否代表数据一定一致?


不代表。延迟为 0 秒表示消费进度已追平,不等于所有记录和值都已验证一致。还需要开启全量或快速数据对比,并根据需要启用增量数据对比。

Oracle 表没有主键还能同步吗?


NineData 官方 Oracle→Doris 链路要求同步对象中的每张表具有主键或唯一约束,否则可能重复同步数据。生产任务应先补充稳定的唯一标识,再执行增量复制。

同步期间 Oracle 发生 DDL 怎么办?


使用早于任务启动时间的自定义增量起点时,如果所选时间段发生 DDL,官方文档提示任务可能失败。生产环境应管理 DDL 变更窗口,并在结构调整后检查任务状态、目标表结构和数据一致性。

总结


Oracle 实时同步到 Doris 不是简单的数据导入,而是一条由结构转换、全量基线、日志 CDC、持续监控和一致性校验组成的完整链路。

NineData 已提供 Oracle→Doris 的专属数据复制能力:支持 Oracle 23ai、21c、19c、18c、12c 和 11g,能够执行结构复制、全量复制和增量复制;在任务配置中可以完成对象选择、字段映射、行过滤、Doris Key 与 Distribute Key 配置、目标存量和增量冲突策略;任务运行后可以监控同步延迟、线程、日志与写入速率,并通过全量、快速和增量数据对比验证迁移质量。

生产落地的关键顺序是:先确认版本、权限、网络、主键和日志条件,再配置映射与冲突策略;全量完成后等待 CDC 追平,最后用数据对比验证结果。只有复制进度、增量延迟和数据一致性同时满足要求,才具备进入正式分析或迁移割接阶段的条件。

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。