基于触发器实现 Sap Hana 实时数据同步

简介

SAP HANA(全称 SAP High-performance ANalytic Appliance)是由SAP开发的一款内置列式数据库的系统平台,除内置数据库以外,还具有高级分析功能(例如预测分析、空间数据处理、文本分析、文本搜索、流分析、图形数据处理),ETL功能,并内置了应用程序服务器,本文提到的 SAP HANA 特指数据平台内置的数据库管理系统。

SAP HANA 是内存数据库系统,可以把系统所有的数据都载入内存中,因此,与传统的将数据存储在硬盘上的数据库相比,HANA的性能可以提升10~10,000倍。一般SAP HANA 内置在 SAP ERP 系统中作为整体提供服务,在制造业应用广泛。

现如今企业都会建立内部的统一数据分析平台,SAP HANA 保存了ERP相关数据,如何实时同步 SAP HANA 的数据到数据平台,一直是困扰企业用户的问题。

CloudCanal 作为一款数据同步工具,新版本中支持 SAP HANA 同步到 MySQL、MariaDB、Doris、StarRocks。下面将介绍 CloudCanal 实现 SAP HANA 实时同步的原理。

整体流程

实现触发器同步的整体流程如下:

  1. 安装触发器,通过触发器捕获增量变更数据
  2. 记录位点,记录增量数据数据同步的起点
  3. 执行全量数据同步
  4. 执行增量数据同步

触发器安装

触发器是一种自动触发执行的存储过程,它可以在数据变更前执行也可以在数据变更后执行,因为本质也是存储过程,所以存储过程支持的操作触发器均支持。

不同数据库对触发器的支持程度不同,Hana 的触发器支持监听 I(新增)、U(更新)、(删除) 三种事件,因此数据的所有变更都可以通过触发器捕获。

安装触发器的方式与创建存储过程类似,即通过执行 SQL 创建触发器。

通过触发器实现增量数据同步,需要触发器捕获数据的变更事件并写入 增量CDC数据表
下面是触发器执行的整体流程:

image.png

触发器安装示例

下面是安装触发器的示例脚本

CREATE OR REPLACE TRIGGER "MY_SCHEMA"."SYM_ON_I_FOR_TST1_CRP" AFTER INSERT ON "MY_SCHEMA"."TEST1" 
REFERENCING NEW ROW NEW FOR EACH ROW 
BEGIN 
  DECLARE NEW_KEY_SUMMARY CLOB := '"COL1":' || CASE WHEN :NEW."COL1" IS NULL THEN 'null' ELSE CONCAT(CONCAT('"',REPLACE(REPLACE(:NEW."COL1",'\','\\'),'"','\"')),'"') END; 
  DECLARE NEW_COL_SUMMARY CLOB := '"COL1":' || CASE WHEN :NEW."COL1" IS NULL THEN 'null' ELSE CONCAT(CONCAT('"',REPLACE(REPLACE(:NEW."COL1",'\','\\'),'"','\"')),'"') END || ',' || '"COL0":' || CASE WHEN :NEW."COL0" IS NULL THEN 'null' ELSE CONCAT(CONCAT('"',REPLACE(REPLACE(:NEW."COL0",'\','\\'),'"','\"')),'"') END; 
  DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN END; 
 
  IF 1=1 THEN 
    INSERT INTO "SYSTEM"."CLOUD_CANAL_TRIGGER_DATA" (CATALOG_NAME, SCHEMA_NAME, TABLE_NAME, EVENT_TYPE, TRIGGER_ID, PK_DATA, ROW_DATA, TRANSACTION_ID, EXTERNAL_DATA, CREATE_TIME) 
    VALUES( 
      'SYSTEMDB', 
      'MY_SCHEMA', 
      'TEST1', 
      'I', 
      1, 
      '{' || NEW_KEY_SUMMARY || '}', 
      '{' || NEW_COL_SUMMARY || '}', 
      CURRENT_UPDATE_TRANSACTION(), 
      '', 
      CURRENT_UTCTIMESTAMP 
    ); 
  END IF; 
 
END;

安装好触发器,下面介绍 增量CDC数据表 的具体结构设计

CDC 增量表

增量CDC数据表结构如下:

CREATE COLUMN TABLE "SYSTEM"."CLOUD_CANAL_TRIGGER_DATA" ("DATA_ID" BIGINT GENERATED BY DEFAULT AS IDENTITY (
START WITH 1 INCREMENT BY 1) NOT NULL ,
    "CATALOG_NAME" VARCHAR(255) NULL ,
    "SCHEMA_NAME" VARCHAR(255) NOT NULL ,
    "TABLE_NAME" VARCHAR(255) NOT NULL ,
    "EVENT_TYPE" VARCHAR(20) NOT NULL ,
    "ROW_DATA" CLOB,
    "PK_DATA" CLOB,
    "OLD_DATA" CLOB,
    "TRIGGER_ID" INTEGER NOT NULL ,
    "EXTERNAL_DATA" VARCHAR(50),
    "CREATE_TIME" LONGDATE
);
CREATE UNIQUE CPBTREE INDEX "CLOUD_CANAL_IDX_D_ID" ON
"SYSTEM"."CLOUD_CANAL_TRIGGER_DATA" ( "DATA_ID" ASC);
CREATE INDEX CLOUD_CANAL_TRIGGER_DATA_CREATE_TIME_IDX ON "SYSTEM".CLOUD_CANAL_TRIGGER_DATA (CREATE_TIME);

增量CDC数据表记录了每次变更数据的

  • 数据库(CATALOG_NAME)
  • 模式名称(SCHEMA_NAME)
  • 表名称(TABLE_NAME)
  • 事件类型(EVENT_TYPE)
  • 变更前的数据镜像(ROW_DATA)
  • 变更前主键数据(PK_DATA)
  • 变更后的数据镜像(OLD_DATA)
  • 触发器ID(TRIGGER_ID)
  • 变更时间(CREATE_TIME)

另外,需要注意的是使用 自增ID 作为主键,同时记录 创建时间

自增ID(DATA_ID)可以唯一标识数据变更事件并确保有序,创建时间(CREATE_TIME)作为数据变更事件的时间戳,记录数据变更发生时间。

增量表定时清理

触发器将增量数据写入增量表后,若未及时清理,可能导致空间占用增加。

在 CloudCanal 中可以设置任务参数 triggerDataCleanEnabled 打开自动定时清理增量表功能,并提供两个参数进行控制:

  • triggerDataCleanIntervalMin:增量表清理间隔(单位:分钟)
  • triggerDataRetentionMin:增量表数据保留时间(单位:分钟)

通过这套机制,用户能够灵活控制增量表的清理操作,同时确保未消费的增量数据不会被意外清除。

image.png

增量表自动演进

Hana 增量任务创建时自动生成增量表,CloudCanal 依赖于增量表实现各种能力,但随着 CloudCanal 版本更新,可能对增量表进行变更(比如加入新字段)。

由此带来的问题是:用户在更新 CloudCanal 后需要手动执行 DDL 以适应增量表结构的变化,若存在大量增量表,操作相当复杂。

为解决此问题,CloudCanal 新增 增量表结构 DIFF 能力,在任务启动时 自动生成差异 DDL 实现对增量表的自动演进

image.png

扫描 CDC 增量表

扫描 CDC 增量表 需要做到不重复扫、不漏数据、顺序扫描。

保证顺序的方式是通过自增ID排序,即 ORDER BY DATA_ID ASC,通过这个方式相当于对全局的变更事件进行编号,基于编号进行扫描和消费,可确保不重。但只做到这一点还不够,会出现丢数据情况,数据丢失的原因如图所示:

image.png

当查询的语句执行时,可能有部分事务没有 COMMIT,导致漏扫,这种问题如何解决?

首先想到的可能是等待一段时间,但是等待多久合适也是问题,时间长了延迟高,时间短了丢数据,而且当事务出现回滚时,自增序列会出现缺失,缺失的原因是事务没有回滚前占用了自增 ID 生成的序号,事务回滚后占用的序号也不会被重复使用。遇到自增 ID 序号缺失的情况,通过等待一段时间方式,只能每次都等待最大超时时间,会导致同步延迟增大。

这个问题的关键点是确定占用自增ID的事务是否还在活跃状态。

CloudCanal 采用的解决办法是 查缺补漏,在扫描 增量CDC数据表 时遇到某个数据 ID 缺失的情况,会尝试插入一条相同 ID 的数据,通过唯一键来判断这个 ID 的数据是否被占用,如果出现异常,则重新查询;如没有异常,则会写入数据占用这个 ID,因为这个 ID 的数据已经被填充,因此也不用担心这个 ID 的数据被漏扫,可以继续读取大于这个 ID 数据。

位点管理

位点用于管理数据同步的进度,记录哪些变更事件已经同步、哪些变更事件没有同步。

基于触发器的数据同步方案选择 CDC 增量表的自增 ID 及时间戳作为位点,自增 ID 可以精确定位到每个数据变更事件,时间戳可以方便以用户视角感知同步任务的延迟情况。

什么时候更新位点?

当捕获的变更事件成功写入目标端后更新位点,如果写入数据成功更新位点失败会导致数据不一致吗?

答案是 不会,因为源端的变更事件是顺序保存并且顺序读取,类似 Mysql Binlog,只要 CloudCanal 按照源端的事件顺序消费,当消费到事件末尾时可以确保源端和目标端的的数据状态一致。

如何判断同步延迟?

Hana 源端增量同步使用位点(增量表自增ID)来判断延迟,当位点向前推进时可准确获取延迟,但若无变更事件导致位点不更新,延迟会持续增大,实际上并未发生延迟。

为解决这一问题,CloudCanal 通过查询增量表来判断是否存在延迟,具体逻辑为:

  • 若存在数据,系统根据增量数据的时间戳计算延迟。
  • 若无数据,任务获取当前时间发送心跳事件,并根据心跳上的时间戳计算延迟。

时间戳仅在重置位点时才用于数据查找,且在查找时进行时区转换处理。

同步演示

添加数据源

  • 数据源管理 -> 添加数据源, 添加 Sap Hana、MySQL
    image.png

创建同步任务

  • 任务管理 -> 新建任务
    image.png

  • 选择需要迁移同步的列 ,目标映射规则可选择与源端一致转小写
    image.png

  • 任务自动做结构迁移全量迁移增量同步
    image.png

测试同步

  • 利用造数据工具对 Hana 进行随机增删改操作。
  • 数据同步结束后校验 Hana 和 MySQL 的数据,40 万左右的数据是一致的。
    image.png

总结

本文简要介绍 CloudCanal 数据迁移工具近期对 Hana 源端数据同步的设计思路,希望对读者有所帮助。

### 回答1: SAP HANA是一种高性能的内存数据库管理系统,它的操作可以分为以下几个步骤: 1. 安装和部署:首先需要根据系统要求安装和部署SAP HANA。这涉及选择适当的硬件和操作系统,安装SAP HANA软件,并进行相关的配置。 2. 数据模型设计:在使用SAP HANA之前,需要先设计数据模型。这包括定义数据表、列和关系,以及数据的结构和组织方式。 3. 数据加载:一旦数据模型设计完成,可以通过不同的方式将数据加载到SAP HANA中。可以使用ETL工具(如SAP Data Services)或直接通过SQL脚本来加载数据。 4. 数据管理:一旦数据加载到SAP HANA中,就可以对数据进行管理和操作。这包括插入、更新和删除数据,以及查询和检索数据。可以使用SQL语言进行数据操作,也可以使用SAP HANA提供的图形用户界面(如SAP HANA Studio)。 5. 数据分析:SAP HANA还提供了强大的数据分析功能。可以使用SQL语句、存储过程、触发器和视图来进行高级数据分析,从而帮助用户更好地理解和利用数据。 6. 性能调优:为了获得最佳的性能,SAP HANA还提供了性能调优的功能。可以通过监视和分析数据库的性能指标,识别和解决性能瓶颈问题,从而提升系统的响应速度和效率。 总之,SAP HANA的操作涉及安装和部署、数据模型设计、数据加载、数据管理、数据分析和性能调优等多个步骤。通过合理地操作和管理SAP HANA,可以提升企业的数据处理能力和决策效率。 ### 回答2: SAP HANA,全称为SAP高速数据分析平台,是一种内存数据库和分析系统。它允许用户对大量数据进行实时处理和分析。 SAP HANA的操作可以通过以下几个步骤进行。 首先,用户需要在服务器上安装SAP HANA软件,创建一个数据库实例。这可以通过SAP HANA Studio或命令行界面完成。 接下来,用户可以使用SAP HANA Studio或者支持的开发工具来连接至创建的数据库,以进行操作。连接后,用户可以使用SQL语言或者其他编程语言如R、Python等执行SQL查询、数据导入和导出等操作。用户可以通过SAP HANA Studio中的图形化界面来管理数据库对象,如表、视图、索引等。 在SAP HANA中,用户可以通过数据预览功能来查看查询结果,并可根据需要进行进一步分析。用户还可以使用数据建模工具来设计和创建数据模型,并使用SAP HANA的机器学习功能进行数据分析和预测。 此外,SAP HANA还支持多种数据集成和ETL(抽取、转换和加载)功能,可以轻松地将数据从其他系统导入SAP HANA,以进行分析和处理。用户可以使用SAP Data Services等工具来实现数据集成和ETL操作。 最后,用户可以根据需要对SAP HANA进行性能优化和监控。SAP HANA提供了一系列的性能监控和优化工具,例如查询优化器、内存管理工具、索引优化等,可以帮助用户提高查询速度和系统性能。 总而言之,SAP HANA是通过安装和配置数据库实例、连接至数据库、执行SQL查询和其他操作、进行数据分析和预测以及优化性能等步骤来操作的。它提供了多种工具和功能,使用户可以高效地处理和分析大量数据。 ### 回答3: SAP HANA是一个内存数据库和应用程序开发平台,它提供了高度并行的计算和实时数据处理能力。SAP HANA的操作可以通过以下几个方面来描述: 1. 数据模型:在SAP HANA中,可以使用不同的数据模型来组织、存储和访问数据。常用的数据模型包括关系型模型(如表和视图)、多维模型(如立方体)以及图形模型(如节点和边)。用户可以根据具体的需求选择合适的数据模型。 2. 数据导入:SAP HANA支持从多种数据源中导入数据。用户可以使用ETL(抽取、转换和加载)工具、SQL脚本或编程接口等方式将数据导入到SAP HANA中。此外,SAP HANA还提供了数据复制和数据同步等功能,可以实时地从其他系统中获取数据。 3. 数据操作:SAP HANA具有强大的数据操作能力,包括数据的插入、更新、删除和查询等操作。用户可以使用SQL语言对数据进行操作,也可以使用SAP HANA提供的编程接口进行开发。此外,SAP HANA还支持自定义函数和存储过程等高级功能。 4. 数据分析:SAP HANA提供了丰富的数据分析功能,可以帮助用户挖掘数据中的价值。用户可以使用SQL语言编写复杂的查询和聚合操作,还可以使用SAP HANA提供的分析库进行数据挖掘和统计分析。此外,SAP HANA还支持机器学习和预测分析等高级功能。 5. 应用开发:SAP HANA不仅是一个数据库,还是一个应用程序开发平台。用户可以使用SAP HANA提供的开发工具和编程接口进行应用程序开发。SAP HANA支持多种开发语言和开发框架,如SQLScript、JavaScript和HTML5等,用户可以根据具体需求选择合适的开发方式。 总之,SAP HANA是一个功能强大、灵活性高的数据库和应用程序开发平台,通过以上操作方式,用户可以充分利用其内存计算和实时处理能力,将数据转化为有价值的信息,并构建高效的业务应用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值