游乐游手机版
首页/数据库/文章详情

SAP HANA到Doris迁移4种方案对比教程

时间:2026-07-24 06:20
针对SAPHANA到Doris的数据迁移,通过CloudCanal工具可实现结构迁移、全量初始化、增量捕获及数据校验一体化。采用触发器捕获变更事件,表级CDC与位点机制提升同步效率与精度。与手动导出、批量ETL、自建CDC方案相比,该方案更适用于生产环境下的准实时同步与核心库减压。

生产环境里要把 SAP HANA 的数据同步到 Doris,整个链路绕不开几个关键环节:结构迁移、全量初始化、增量捕获、写入 Doris,以及最后的数据校验。每一步都不简单,但好在可以借助工具把流程串起来。

这篇文章就来聊聊,怎么用 CloudCanal 搭一条从 HANA 到 Doris 的同步链路。它能帮你把结构迁移、全量数据、增量捕获、写入和校验都放进同一个任务里:先迁结构和全量数据,然后用 Trigger 捕获 HANA 的 INSERT / UPDATE / DELETE,最后做数据校验和订正。

为什么要把 SAP HANA 数据同步到 Doris?

SAP HANA 本身确实能处理事务和分析,也经常被用于实时分析场景。但在生产环境里,把核心业务库和分析平台拆开,已经是一种比较常见的架构选择。让 HANA 继续服务 ERP、财务、供应链这些核心系统,把面向报表、看板、明细查询的负载同步到 Doris,好处很明显。

减少核心库的分析压力

报表查询、明细查询和业务交易如果共用同一套 HANA 资源,高峰期很容易互相影响。把分析查询交给 Doris,核心库上的大查询压力就能降下来。

实时分析需求越来越强

经营看板、订单分析、库存分析、财务明细——这些需求早已不满足于 T+1 的刷新频率,很多团队希望做到分钟级甚至秒级。这时候,周期性离线导出往往跟不上数据新鲜度的要求,需要持续同步 HANA 的新增、更新和删除操作。

分析层需要单独扩展

如果为了分析查询持续扩容 HANA,成本和运维压力都会水涨船高。把分析负载同步到 Doris 后,分析侧可以按自己的查询量、并发量和数据规模来灵活扩展,互不干扰。

多源数据需要汇到一起分析

很多企业不只有 HANA,还会同时使用 MySQL、Oracle、SQL Server、PostgreSQL、Kafka 等系统。把 HANA 的数据接入 Doris,就能和其他业务数据放到统一的分析层里查询,不用再来回切换数据源。

HANA 到 Doris 同步技术点

数据同步整体流程

CloudCanal 实现 HANA 源端增量数据同步,主要靠触发器捕获变更事件。整体流程大致是这样的:先安装触发器,通过它捕获增量变更数据;记录位点,标记增量数据同步的起点;接着执行全量数据迁移;最后进入增量数据同步阶段。

表级别 CDC 表

CloudCanal 设计了表级别的 CDC 表,每张源表都对应一张 CDC 表。CDC 表的结构只是在原表的基础上增加了几个位点字段,专门用于增量同步。

相比于把所有数据写入单一 CDC 表,表级别的 CDC 表更独立,方便多次订阅同一张表。而且触发器只需要执行 INSERT 语句,对字段多的表也能快速执行。扫描消费 CDC 数据时,不需要额外处理,消费逻辑更简单。

原表

 复制代码CREATE COLUMN TABLE "SYSTEM"."TABLE_TWO_PK" (
  "ORDERID" INTEGER NOT NULL ,
  "PRODUCTID" INTEGER NOT NULL ,
  "QUANTITY" INTEGER,
  CONSTRAINT "FANQIE_pkey_for_TA_171171268" PRIMARY KEY ("ORDERID", "PRODUCTID")
)

CDC 表

 复制代码CREATE COLUMN TABLE "SYSTEM"."SYSTEMDB_FANQIE_TABLE_TWO_PK_CDC_TABLE" (
  "ORDERID" INTEGER,
  "PRODUCTID" INTEGER,
  "QUANTITY" INTEGER,
  "__$DATA_ID" BIGINT NOT NULL ,
  "__$TRIGGER_ID" INTEGER NOT NULL ,
  "__$TRANSACTION_ID" BIGINT NOT NULL ,
  "__$CREATE_TIME" TIMESTAMP,
  "__$OPERATION" INTEGER NOT NULL
);
-- other index

触发器 (INSERT)

 复制代码CREATE TRIGGER "FANQIE"."CLOUD_CANAL_ON_I_TABLE_TWO_PK_TRIGGER_104" AFTER INSERT ON "SYSTEM"."TABLE_TWO_PK" REFERENCING NEW ROW NEW FOR EACH ROW
BEGIN
  DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN  END;
  IF 1=1 THEN
    INSERT INTO "SYSTEM"."SYSTEMDB_FANQIE_TABLE_TWO_PK_CDC_TABLE" (__$DATA_ID, __$TRIGGER_ID, __$TRANSACTION_ID, __$CREATE_TIME, __$OPERATION, "ORDERID","PRODUCTID","QUANTITY")
    VALUES(
      "SYSTEM"."CC_TRIGGER_SEQ".NEXTVAL,
      433,
      CURRENT_UPDATE_TRANSACTION(),
      CURRENT_UTCTIMESTAMP,
      2,
      :NEW."ORDERID" ,
      :NEW."PRODUCTID" ,
      :NEW."QUANTITY"
    );
  END IF;
END;

表级别任务位点

在表级别 CDC 表模式下,同步增量数据时,每个表都有自己的位点,原来的单一位点显然满足不了这种需求。于是 CloudCanal 引入了表级别的增量同步位点,确保每个表都能消费各自对应的增量同步位点。位点具体长这样:

 复制代码[
  {
    "db": "SYSTEMDB",
    "schema": "FANQIE",
    "table": "TABLE_TWO_PK",
    "dataId": 352,
    "txId": 442441,
    "timestamp": 1715828416114
  },
  {
    "db": "SYSTEMDB",
    "schema": "FANQIE",
    "table": "TABLE_TWO_PK_2",
    "dataId": 97,
    "txId": 11212,
    "timestamp": 1715828311123
  },
  ...
]

这种设计的好处很明显:位点精细控制——每个表都有自己的增量同步位点,可以只重新消费特定表的增量数据,不用把全表数据都拉一遍,精度高了,效率也上去了;数据并行处理——因为每个表有自己的位点,不同表的增量数据可以同时处理,避免了单一位点导致的串行瓶颈,同步速度自然就快了。

创建任务前确认

为了让全量初始化和增量写入更稳定,创建任务前建议重点确认几件事:

  • 按 Doris Unique Key 模型规划目标表。CloudCanal 通过 Stream Load 写入 Doris,按主键整行替换,适合承接 HANA 主键表的新增、更新和删除。
  • 迁移前确认 HANA 源表主键,同步规划好 Doris Unique Key,避免无主键表影响全增量链路。
  • 如果 HANA 源表发生结构变更,按 HANA DDL 变更文档处理后再继续同步,避免源端和目标端结构不一致。
  • 源表里如果带了 TEXTBIN_TEXTST_POINTST_GEOMETRYBINARYBLOB 这类特殊类型,建议提前评估,能取舍的取舍,要做类型转换的也提前规划好。
  • 确保迁移同步节点能访问 Doris / SelectDB FE QueryPort 和 FE/BE HttpPort,保证元数据查询和 Stream Load 写入正常执行。

用 CloudCanal 做 SAP HANA 到 Doris 同步演示

准备动作

  • 登录 CloudCanal SaaS 版本,或下载安装商业版私有部署。
  • 准备好源端和目标端数据库及对应数据。
  • 参考 HANA 权限准备文档做账号授权。

添加数据源

登录 CloudCanal 控制台,点击 数据源管理 > 新增数据源

创建源端数据源,选择 自建数据源,选择 HANA 并填写相关信息。

创建目标端数据源,选择 自建数据源,选择 Doris 并填写相关信息。

任务创建

点击 同步任务 > 创建任务

源端选择 HANA 数据源,目标端选择 Doris 数据源,分别点击 测试连接 按钮并设置数据库映射关系。点击下一步。

选择 增量同步,并且勾选 全量初始化。点击下一步。

选择订阅的表,点击下一步。

配置列映射,点击下一步。

点击创建任务。

任务创建过程会执行一系列异步操作。可以点击 同步设置 > 异步任务,找到任务创建记录并点击 详情 查看。

HANA 源端任务创建通常包含以下步骤:结构迁移、初始化 HANA CDC 表以及对应触发器、分配任务执行机器、创建任务状态机、完成任务创建。

任务创建完成后,CloudCanal 会自动流转:结构迁移——把 HANA 源端表定义迁移到 Doris,如果 Doris 中已经存在同名表,则会忽略;全量数据迁移——把已有存量数据完整迁移到 Doris;增量数据同步——持续把 HANA 增量数据同步到 Doris。

数据校验

任务进入增量同步并且延迟追平后,建议创建数据校验任务,检查 HANA 源端和 Doris 目标端是否一致。可以在同步任务详情页点击 功能列表 > 创建相似任务,在任务类型中选择 数据校验数据校验和订正。创建过程中如果遇到问题,可以查阅相关文档或联系技术支持。

其他同步方案

手动导出 / 导入

最直接的做法,就是从 HANA 导出 CSV 或其他中间文件,再用 Doris 的导入功能写入目标表。

这种方式上手快、依赖少,适合小数据量、一次性迁移、测试环境初始化或历史冷数据搬迁。但问题也很明显:导出时如果 HANA 还在写入,数据一致性很难保证;导入失败后重跑成本高;后续要做增量同步,还得另起一套链路。所以,它不太适合生产级持续同步。

批量 ETL

批量 ETL 通常是先做一次全量,再按时间戳、业务水平线或批次号定时抽取增量。

它适合低频报表、小时级刷新、源表有可靠更新时间字段的场景。相比手动导出,批量 ETL 更自动化,也更容易接入调度系统。但批量 ETL 很依赖“增量字段”,如果 updated_at 不可靠、存在晚到更新、删除记录无法表达,或者需要高频同步,就容易漏数、重复,也很难补数。

自建 CDC / 触发器链路

如果要捕获 HANA 的 INSERT、UPDATE、DELETE,可以用触发器记录变更,再由消费程序写入 Doris。

这种方案实时性更好,也能覆盖更多变更。但要处理的工程细节很多:触发器如何安装和恢复、变更表如何清理、消费位点如何管理、Doris 写入失败如何重试、数据如何校验,都需要团队自己实现并长期维护。如果企业已经有成熟的数据平台团队,可以考虑自建 CDC;如果只是为了一条 HANA 到 Doris 链路,自研通常不太划算。

方案对比

维度手动导出 / 导入批量 ETL自建 CDCCloudCanal
适合场景一次性搬迁、测试初始化低频报表同步有平台团队自研链路生产迁移、准实时同步
全量迁移支持支持需自行实现支持
增量同步不支持有限支持支持支持
UPDATE / DELETE手动处理容易漏语义可实现支持常见 DML
停机窗口较长中等较短较短
数据校验手写脚本手写脚本需自行实现支持校验订正
运维成本中低

总结

如果只是一次性搬小表,导出导入就够了。如果是低频同步,批量 ETL 可以满足部分报表需求。如果团队自研能力强、后续多条链路可复用,也可以考虑自建 CDC。但如果是生产环境,希望尽量减少停机,并持续把 HANA 变更同步到 Doris,全量 + 增量一体化的迁移方式显然更合适。

来源:https://juejin.cn/post/7665261269844852736
上一篇Hive row_number()处理重复行的方法 下一篇MyBatis数据源切换详解与实现
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
自增主键值从何而来?深入理解原理,告别只会auto_increment
数据库 · 2026-07-25

自增主键值从何而来?深入理解原理,告别只会auto_increment

KingbaseES推荐使用serial、bigserial、显式sequence或identity列实现自增主键。serial创建integer并关联序列,bigserial对应bigint;显式sequence可自定义起始值等参数;identity有generatedbydefault(允许指定值)与always(禁止)两种模式。

Linux下瀚高数据库授权文件过期及替换解决方案
数据库 · 2026-07-25

Linux下瀚高数据库授权文件过期及替换解决方案

在银河麒麟系统下,瀚高数据库hgdb-4 5试用授权20天到期后需替换正式授权文件。正确操作:停止服务,备份旧文件,将授权文件复制到 opt highgo hgdb-4 5 etc lic 并命名为hgdb lic,设置权限600和属主highgo:highgo,再启动服务。禁止直接修改data目录下的license info文件。

Oracle BLOB实时同步的5大技术挑战与难点解析
数据库 · 2026-07-25

Oracle BLOB实时同步的5大技术挑战与难点解析

OracleBLOB实时同步面临分片组装、多列隔离、长事务跨窗口、事务回滚及大对象资源控制等技术挑战,必须在日志中精确还原完整字段值,才能保证源端与目标端数据完全一致,这对同步系统的稳健性提出了高要求。

MySQL禁用redo日志导致全备失败
数据库 · 2026-07-25

MySQL禁用redo日志导致全备失败

MySQL全量备份失败是由于数据定义语言操作触发排序索引构建,禁用重做日志导致XtraBackup无法获取一致性备份。测试验证表明,优化表语句即使无数据也会触发该问题。根本原因在于排序索引构建过程跳过了重做日志记录,破坏了备份的一致性。

Kafka架构图优化与改进的全面详细步骤与实践指南
数据库 · 2026-07-25

Kafka架构图优化与改进的全面详细步骤与实践指南

Kafka作为实时数据流处理的核心中间件,其底层架构虽已相当成熟,但在实际生产环境中,要充分发挥其性能潜力,仍需落实到具体的调优与架构改造上。核心目标可归纳为三点:如何承载更高的吞吐量、如何保障数据不丢失、以及故障发生时如何快速恢复。本文将从这几个关键方向出发,深入探讨如何真正榨干Kafka集群的性