要实现增量抽取,关键是如何准确快速的捕获变化的数据。优秀的增量抽取机制要求ETL能够将业务系统中的变化数据按一定的频率准确地捕获到,同时不能对业务系统造成太大的压力,影响现有业务。相对全量抽取而言,增量抽取的设计更复杂,有一种将全量抽取过程自动转换为增量抽取过程的ETL设计思路,前提是必须捕获变化的数据,增量数据抽取中常用的捕获变化数据的方法有以下几种:

2.1 触发器方式

触发器方式是普遍采取的一种增量抽取机制。该方式是根据抽取要求,在要被抽取的源表上建立插入、修改、删除3个触发器,每当源表中的数据发生变化,就被相应的触发器将变化的数据写入一个增量日志表,ETL的增量抽取则是从增量日志表中而不是直接在源表中抽取数据,同时增量日志表中抽取过的数据要及时被标记或删除。

为了简单起见,增量日志表一般不存储增量数据的所有字段信息,而只是存储源表名称、更新的关键字值和更新操作类型(knsen、update或delete),ETL增量抽取进程首先根据源表名称和更新的关键字值,从源表中提取对应的完整记录,再根据更新操作类型,对目标表进行相应的处理。

例如,对于源表为Oracle类型的数据库,采用触发器方式进行增量数据捕获的过程如下:

(1)创建增量日志表DML LOG:

create table DML_LOG(
ID NUMBER primary key,//自增主键
TABLE_NAME VARCHAR2(200),//源表名称
RECORD_ID NUMBER,//源表增量记录的主键值
DML_TYPE CHAR(1),//增量类型,I表示新增;U表示更新;D表示删除
EXECUTE DATE DATE //发生时间
);

(2)为DML_LOG创建一个序列SEQ_DML_LOG,以便触发器写增量日志表时生成ID值。

(3)针对要监听的每一张表,创建一个触发器,例如对表Test创建触发器如下:

create Or replace trigger T BEFORE INSERT OR UPDATE ORDELETEONTforeach row
declare 1 dml type varchar2(1);
begin
if INSERTING then l_dml type:=‘I’;
elsif UPDATING then I_dml_type:=‘U’;
elsif DELETING then l_dml_type:=‘D’;
end if;
if DELETING then
insert into DML_LOG(ID,TABLE_NAME,RECORD_ID,EXECUTE_DATE,DML_TYPE)
values(seq_dml_log.nextval,‘Test,:old.ID,sysdate,l_dml_type);
else
insert into DML_LOG(ID,TABLE_NAME,RECORD_ID,EXECUTE_DATE,DML_TYPE)
values(seq_dml_log.nextval,‘Test’,:new.ID,sysdate,l_dml_type);
end if;
end;

这样,对表T的所有DML操作就记录在增量日志表DML_LOG中,注意增量日志表中并没有完全记录增量数据本身,只是记录了增量数据的来源。进行增量ETL时,只需要根据增量日志表中的记录情况,反查源表得到真正的增量数据。
2.2 时间戳方式

时间戳方式是指增量抽取时,抽取进程通过比较系统时间与抽取源表的时间戳字段的值来决定抽取哪些数据。这种方式需要在源表上增加一个时间戳字段,系统中更新修改表数据的时候,同时修改时间戳字段的值。

有的数据库(例如Sql Server)的时间戳支持自动更新,即表的其它字段的数据发生改变时,时间戳字段的值会被自动更新为记录改变的时刻。在这种情况下,进行ETL实施时就只需要在源表加上时间戳字段就可以了。对于不支持时间戳自动更新的数据库,这就要求业务系统在更新业务数据时,通过编程的方式手工更新时间戳字段。

使用时间戳方式可以正常捕获源表的插入和更新操作,但对于删除操作则无能为力,需要结合其它机制才能完成。

2.3 全表删除插入方式

全表删除插入方式是指每次抽取前先删除目标表数据,抽取时全新加载数据。该方式实际上将增量抽取等同于全量抽取。对于数据量不大,全量抽取的时间代价小于执行增量抽取的算法和条件代价时,可以采用该方式。

2.4 全表比对方式

全表比对即在增量抽取时,ETL进程逐条比较源表和目标表的记录,将新增和修改的记录读取出来。

优化之后的全部比对方式是采用MD5校验码,需要事先为要抽取的表建立一个结构类似的MD5临时表,该临时表记录源表的主键值以及根据源表所有字段的数据计算出来的MD5校验码,每次进行数据抽取时,对源表和MD5临时表进行MD5校验码的比对,如有不同,进行update操作:如目标表没有存在该主键值,表示该记录还没有,则进行insert操作。然后,还需要对在源表中已不存在而目标表仍保留的主键值,执行delete操作。

2.5 日志表方式

对于建立了业务系统的生产数据库,可以在数据库中创建业务日志表,当特定需要监控的业务数据发生变化时,由相应的业务系统程序模块来更新维护日志表内容。增量抽取时,通过读日志表数据决定加载哪些数据及如何加载。日志表的维护需要由业务系统程序用代码来完成。

2.6 系统日志分析方式

该方式通过分析数据库自身的日志来判断变化的数据。关系犁数据库系统都会将所有的DML操作存储在日志文件中,以实现数据库的备份和还原功能。ETL增晕抽取进程通过对数据库的日志进行分析,提取对相关源表在特定时间后发生的DML操作信息,就可以得知自上次抽取时刻以来该表的数据变化情况,从而指导增量抽取动作。

有些数据库系统提供了访问日志的专用的程序包(例如Oracle的LogMiner),使数据库日志的分析工作得到大大简化。

2.7 特定数据库的方式

以下介绍常见的针对特有数据库系统的增景抽取方式:

2.7.1 Oracle改变数据捕获(changed data capture,CDC)方式

OracleCDC特性是在Oraele9i数据库中引入的。CDC能够帮助识别从上次抽取之后发生变化的数据。利用CDC,在对源表进行insert、upclate或delete等操作的同时就可以提取数据,并且变化的数据被保存在数据库的变化表中。这样就可以捕获发生变化的数据,然后利用数据库视图以一种可控的方式提供给ETL抽取进程,作为增量抽取的依据。

CDC方式对源表数据变化情况的捕获有两种方式:同步CDC和异步CDC。同步CDC使用源数据库触发器来捕获变更的数据。这种方式是实时的,没有任何延迟。当DML操作提交后,变更表中就产生了变更数据。异步CDC使用数据库重做日志(redolog)文件,在源数据库发生变更以后,才进行数据捕获。

2.7.2 Oracle闪回查询方式

Oracle9i以上版本的数据库系统提供了闪回查询机制,允许用户查询过去某个时刻的数据库状态。这样,抽取进程可以将源数据库的当前状态和上次抽取时刻的状态进行对比,快速得出源表数据记录的变化情况。
比较和分析

可见,ETL在进行增量抽取操作时,有以上各种机制可以选择。现从兼容性、完备性、性能和侵入性3个方面对这些机制的优劣进行比较分析。

数据抽取需要面对的源系统,并不一定都是关系型数据库系统。某个ETL过程需要从若干年前的遗留系统中抽取Excel或者CSV文本数据的情形是经常发牛的。这时,所有基于关系型数据库产品的增量机制都无法工作,时间戳方式和全表比对方式可能有一定的利用价值,在最坏的情况下,只有放弃增量抽取的思路,转而采用全表删除插入方式。

完备性方面,时间戳方式不能捕获delete操作,需要结合其它方式一起使用。

增量抽取的性能因素表现在两个方面,一是抽取进程本身的性能,二是对源系统性能的负面影响。触发器方式、日志表方式以及系统日志分析方式由于不需要在抽取过程中执行比对步骤,所以增量抽取的性能较佳。全表比对方式需要经过复杂的比对过程才能识别出更改的记录,抽取性能最差。在对源系统的性能影响方面,触发器方式由于是直接在源系统业务表上建立触发器,同时写临时表,对于频繁操作的业务系统可能会有一定的性能损失,尤其是当业务表上执行批量操作时,行级触发器将会对性能产生严重的影响;同步CDC方式内部采用触发器的方式实现,也同样存在性能影响的问题;全表比对方式和日志表方式对数据源系统数据库的性能没有任何影响,只是它们需要业务系统进行额外的运算和数据库操作,会有少许的时间损耗;时间戳方式、系统日志分析方式以及基于系统日志分析的方式(异步CDC和闪回查询)对数据库性能的影响也是非常小的。

对数据源系统的侵入性是指业务系统是否要为实现增量抽取机制做功能修改和额外操作,在这一点上,时间戳方式值得特别关注。该方式除了要修改数据源系统表结构外,对于不支持时间戳字段自动更新的关系型数据库产品,还必须要修改业务系统的功能,让它在源表t执行每次操作时都要显式的更新表的时间戳字段,这在ETL实施过程中必须得到数据源系统高度的配合才能达到,并且在多数情况下这种要求在数据源系统看来是比较“过分”的,这也是时间戳方式无法得到广泛运用的主要原因。另外,触发器方式需要在源表上建立触发器,这种在某些场合中也遭到拒绝。还有一些需要建立临时表的方式,例如全表比对和日志表方式。可能因为开放给ETL进程的数据库权限的限制而无法实施。同样的情况也可能发生在基于系统日志分析的方式上,因为大多数的数据库产品只允许特定组的用户甚至只有DBA才能执行日志分析。闪回杏询在侵入性方面的影响是最小的。

各种数据增量抽取机制的优劣性综合分析如表1所示。

表1 各种数据增量抽取机制优劣性综合分析

通过对各种增量抽取机制的对比分析,我们发现,没有一种机制具有绝对的优势,不同机制在各种因素F的表现大体上都是相对平衡的。兼容性较差的机制,像CDC和闪回查询机制,由于充分利用了数据源系统DBMS的特性,相对来说具有较好的整体优势:最容易实现以及兼容性最佳的全表删除插入机制,则是以牺牲抽取性能为代价的:系统日志分析方式对源业务系统的功能无需作任何改变,对源系统表也无需建立触发器,而抽取性能也不错,但有可能需要源系统开放DBA权限给ETL抽取进程,并且自行分析日志系统难度较高,不同数据库系统的日志格式不一致,这就在一定程度上限制了它的使用范围。所以,ETL实施过程中究竞选择哪种增量抽取机制,要根据实际的数据源系统环境进行决策,需要综合考虑源系统数据库的类型、抽取的数据量(决定对性能要求的苛刻程度)、对源业务系统和数据库的控制能力以及实现难度等各种因素,甚至结合各种不同的增量机制以针对环境不同的数据源系统进行ETL实施。

ETL的增量抽取机制相关推荐

  1. ETL 数据加载机制概述

    ETL 是数据抽取(Extract).转换(Transform).加载(Load)的简写,它的功能是从数据源抽取出所需的数据,经过数据清洗和转换,最终按照预先定义好的数据仓库模型,将数据加载到数据仓库 ...

  2. Orcal ETL 增量抽取--ORA_ROWSCN伪列

    Orcal ETL 增量抽取–ORA_ROWSCN伪列 1.背景 项目中需要进行orcal数据增量抽取,然而源表无主键,无时间戳,无唯一键,别人的业务系统又无法动.最开始想通过解析日志以及v$sql动 ...

  3. java数据抽取到数据仓库_关于数据增量抽取的模拟实现——脚本实现

    具体排过版的请参看http://Percywang.itpub.net 本文主要是针对关于数据增量抽取的模拟实现--原理进行实现的 实现的环境: 业务数据库:Oracle9i 数据仓库数据库:SQLS ...

  4. oracle 增量_【干货分享】DMETL中的增量抽取初识

    DMETL实现了增量数据的同步.在源表上进行的增删改操作,可以通过增量数据抽取,同步到目的表中.在第一次将源表数据全量抽取到目的表中后,可以通过重复地执行增量数据抽取,将源表上的增删改操作产生的变化数 ...

  5. BW顾问进阶:SAP BW后勤数据源抽取机制

    SAP BW后勤数据增量机制      目录 1.    概述.... 4 1.1后勤数据抽取的两种机制 1.1.1初始化抽取 1.1.2增量抽取 1.2 SAP逻辑工作单元 1.3更新模式及方法介绍 ...

  6. oracle全表增量抽取,每日数据增量抽取问题讨论

    每日数据增量抽取问题讨论[@more@]咨询各位高人. 目前状况是 我单位每天都要产生 一个单品资料的基础表, 是所有单品,大约5万条数据 ,但是每天这个表都有多少改变,比如:有些单品更新,有一些删除 ...

  7. Sqoop增量抽取Oracle数据,最近8个小时的数据未被抽取

    在使用sqoop增量抽取数据时,在不指定m的情况下,导出日志中可以看到添加了截止时间,但这个时间并不是系统时间,经过多次比较发现,这个时间比当前系统时间早8个小时.因此怀疑是时区问题. 检查Oracl ...

  8. kettle利用时间戳(timestamp)做增量抽取

    创建两个表: 用户为Scott create table zhiyuanb(填表日期 Date primary Key, 姓名  Varchar2(10) Not Null,           年龄 ...

  9. 数据增量抽取项目重演

    文章目录 前言 参考链接 时间线 项目介绍 项目场景 项目需求 项目回顾 问题 其它 数据增量抽取与数据库同步的区别 项目架构图 接口方 任务 步骤 使用MyBatisPlus对数据进行查询 对数据进 ...

最新文章

  1. linux opensuse 集成工具yast 使用方法
  2. mysql 视图 临时表模式
  3. 硬刚一周,3W字总结,一年的经验告诉你如何准备校招,拿大厂offer
  4. Mac OS使用技巧之十四:自定义文件图标
  5. 起步前要做哪些准备?
  6. Redis 源码分析之故障转移
  7. Leetcode每日一题:164.maximum-gap(最大间距)
  8. java随机输出_用java随机输出汉字
  9. 校招刷题---java选择题笔记05
  10. 读者问题答疑:4 个超级简单的 Linux 基础考试题!
  11. c++链表——银行账户管理系统
  12. 【TS】1307- TypeScript 你还只会用 any?
  13. Mac 安卓投屏Scrcpy使用
  14. 数组下标越界可能出现的问题
  15. 基于Mysql+Java的超市管理系统(附源码)
  16. 为什么你需要学 Go?
  17. 数据分析报告的 4 种情景
  18. 2. JavaScript基础实战高级
  19. VB.NET生成随机串或随机数字的方法
  20. 互联网产品经理技能树

热门文章

  1. 我要学ASP.NET MVC 3.0(十三): MVC 3.0 防止跨站点请求伪造 (CSRF) 攻击
  2. 阿里的下一个15年:大数据是核心
  3. !!!SQL sever 函数表达
  4. HTML5手机开发——滚动和惯性缓动
  5. 揭开PC-Lint9的神秘面纱
  6. Project Euler
  7. 开发运维日常坑 总结 51-100
  8. KVM虚拟机openVSwitch杂记(2)
  9. for和select循环语句的应用实践
  10. Android仿华为天气绘制刻度盘