ETL -- ORACLE -- CDC技术
ETL:
Extract(抽取)-Transform(清洗转换)-Load(加载),常用于数据仓库,是负责完成数据从数据源向目标数据仓库转化的过程,是实施数据仓库的重要步骤。
ETL增量抽取: 要实现增量抽取,关键是如何准确快速的捕获变化的数据。优秀的增量抽取机制要求ETL能够将业务系统中的变化数据按一定的频率准确地捕获到,同时不能对业务系统造成 太大的压力,影响现有业务。相对全量抽取而言,增量抽取的设计更复杂.
CDC:
Change Data Capture(改变数据捕获)是oracle在数据库级别实现的增量抽取解决方案之一。
CDC能够帮助你识别从上次提取之后发生变化的数据。
利用CDC,在对源表进行INSERT、UPDATE或 DELETE等操作的同时就可以提取数据,并且变化的数据被保存在数据库的变化表中。这样就可以捕获发生变化的数据,然后利用数据库视图以一种可控的方式提供给目标系统。
目前ETL增量数据处理方式有:
1.触发器方式
是普遍采取的一种增量抽取机制。该方式是根据抽取要求,在要被抽取的源表上建立插入、修改、删除3个触发器,每当源表中的数据发生变化,就被相应的触发器将
变化的数据写入一个增量日志表,ETL的增量抽取则是从增量日志表中而不是直接在源表中抽取数据,同时增量日志表中抽取过的数据要及时被标记或删除。为了简单起见,增量日志表一般不存储增量数据的所有字段信息,而只是存储源表名称、更新的关键字值和更新操作
类型(knsen、update或delete),ETL增量抽取进程首先根据源表名称和更新的关键字值,从源表中提取对应的完整记录,再根据更新操作类型,对目标表进行相应的处理。
2.时间戳方式
时间戳方式是指增量抽取时,抽取进程通过比较系统时间与抽取源表的时间戳字段的值来决定抽取哪些数据。这种方式需要在源表上增加一个时间戳字段,系统中更新修改表数据的时候,同时修改时间戳字段的值。有的数据库(例如Sql Server)的时间戳支持自动更新,即表的其它字段的数据发生改变时,时间戳字段的值会被自动更新为记录改变的时刻。在这种情下,进行ETL实施时就只需要在源表加上时间戳字段就可以了。对于不支持时间戳自动更新的数据库,这就要求业务系统在更新业务数据时,通过编程的方式手工更新时间戳字段。使用时间戳方式可以正常捕获源表的插入和更新操作,但对于删除操作则无能为力,需要结合其它机制才能完成。
更新时间戳。
3.全表删除插入方式
全表删除插入方式是指每次抽取前先删除目标表数据,抽取时全新加载数据。该方式实际上将增量抽取等同于全量抽取。对于数据量不大,全量抽取的时间代价小于执行增量抽取的算法和条件代价时,可以采用该方式。
4.全表比对方式
全表比对即在增量抽取时,ETL进程逐条比较源表和目标表的记录,将新增和修改的记录读取出来。优化之后的全部比对方式是采用MD5校验码,需要事先为要抽取的表建立一个结构类似的MD5临时表,该临时表记录源表的主键值以及根据源表所有字段的数据计算出来的。
MD5校验码,每次进行数据抽取时,对源表和MD5临时表进行MD5校验码的比对,如有不同,进行update操作:如目标表没有存在该主键值,表示该记录还没有,则进行insert操作。
然后,还需要对在源表中已不存在而目标表仍保留的主键值,执行delete操作。
5.日志表方式
对于建立了业务系统的生产数据库,可以在数据库中创建业务日志表,当特定需要监控的业务数据发生变化时,由相应的业务系统程序模块来更新维护日志表内容。增量抽取时,
通过读日志表数据决定加载哪些数据及如何加载。日志表的维护需要由业务系统程序用代码来完成。
6.系统日志分析方式
该方式通过分析数据库自身的日志来判断变化的数据。关系犁数据库系统都会将所有的DML操作存储在日志文件中,以实现数据库的备份和还原功能。ETL增晕抽取进程通过对数据库的日志进行分析,提取对相关源表在特定时间后发生的DML操作信息,就可以得知自上次抽取时刻以来该表的数据变化情况,从而指导增量抽取动作。有些数据库系统提供了访问日志的专用的程序包(例如Oracle的LogMinder),使数据库日志的分析工作得到大大简化。
7.特定数据库方式(Oracle)
以下介绍常见的针对特有数据库系统的增景抽取方式。
7.1 Oracle改变数据捕获(changeddatacapture,CDC)方式:OracleCDC特性是在Oraele9i数据库中引入的。CDC能够帮助识别从上次抽取之后发生变化的数据。
利用CDC,在对源表进行insert、upclate或delete等操作的同时就可以提取数据,并且变化的数据被保存在数据库的变化表中。这样就可以捕获发生变化的数据,然后利用数据库视图以一种可控的方式提供给ETL抽取进程,作为增量抽取的依据。CDC方式对源表数据变化情况的捕获有两种方式:同步CDC和异步CDC。同步CDC使用源数据库触发器来捕获变更的数据。这种方式是实时的,没有任何延迟。当DML操作提交后,变更表中就产生了变更数据。异步CDC使用数据库重做日志(redolog)文件,在源数据库发生变更以后,才进行数据捕获。
7.2 Oracle闪回查询方式:Oracle9i以上版本的数据库系统提供了闪回查询机制,允许用户查询过去某个时刻的数据库状态。这样,抽取进程可以将源数据库的(BI)
当前状态和上次抽取时刻的状态进行对比,快速得出源表数据记录的变化情况。
8.比较和分析
可见,ETL在进行增量抽取操作时,有以上各种机制可以选择。现从兼容性、完备性、性能和侵入性3个方面对这些机制的优劣进行比较分析。数据抽取需要面对的源系统,并不一定都是关系型数据库系统。某个ETL过程需要从若干年前的遗留系统中抽取Excel或者CSV文本数据的情形是经常发牛的。这时,所有基于关系型数据库产品的增量机制都无法工作,时间戳方式和全表比对方式可能有一定的利用价值,在最坏的情况下,只有放弃增量抽取的思路,转而采用全表删除插入方式。完备性方面,时间戳方式不能捕获delete操作,需要结合其它方式一起使用。增量抽取的性能因素表现在两个方面,一是抽取进程本身的性能,二是对源系统性能的负面影响。触发器方式、日志表方式以及系统日志分析方式由于不需要在抽取过程中执行比对步骤,所以增量抽取的性能较佳。全表比对方式需要经过复杂的比对过程才能识别出更改的记录,抽取性能最差。在对源系统的性能影响方面,触发器方式由于是直接在源系统业务表上建立触发器,同时写临时表,对于频繁操作的业务系统可能会有一定的性能损失,尤其是当业务表上执行批量操作时,行级触发器将会对性能产生严重的影响;同步CDC方式内部采用触发器的方式实现,也同样存在性能影响的问题;全表比对方式和日志表方式对数据源系统数据库的性能没有任何影响,只是它们需要业务系统进行额外的运算和数据库操作,会有少许的时间损耗;时间戳方式、系统日志分析方式以及基于系统日志分析的方式(异步CDC和闪回查询)对数据库性能的影响也是非常小的。对数据源系统的侵入性是指业务系统是否要为实现增抽取机制做功能修改和额外操作,在这一点上,时间戳方式值得特别关注该方式除了要修改数据源系统表结构外,对于不支持时间戳字段自动更新的关系型数据库产品,还必须要修改业务系统的功能,让它在源表t执行每次操作时都要显式的更新表的时间戳字段,这在ETL实施过程中必须得到数据源系统高度的配合才能达到,并且在多数情况下这种要求在数据源系统看来是比较“过分”的,这也是时间戳方式无法得到广泛运用的主要原因。另外,触发器方式需要在源表上建立触发器,这种在某些场合中也遭到拒绝。还有一些需要建立临时表的方式,例如全表比对和日志表方式。可能因为开放给ETL进程的数据库权限的限制而无法实施。同样的情况也可能发生在基于系统日志分析的方式上,因为大多数的数据库产品只允许特定组的用户甚至只有DBA才能执行日志分析。闪回杏询在侵入性方面的影响是最小的。
最为常用的ETL增量数据处理方式有四种:
1.时间戳(弱点:要求业务系统的表必须一个可以标识新旧数据的字段)
2.日志对比
3.全面数据对比(弱点:高网络负载、性能代价高、无法反映数据的历史状态)
4.触发器(优点:抽取性能高。缺点:需要业务表建立触发器,对业务系统有一定的影响。)
CDC的两个模式:
同步:同步CDC主要是采用触发器记录新增数据,基本能够做到实时增量抽取。
异步:异步CDC通过分析已经commit的日志记录来得到增量数据信息,有一定的时间延迟,并且提供了到Oracle Streams的接口。
同步CDC在企业版或者标准版中都可以使用,异步CDC则只包含在企业版中。
CDC的发布订立模型:
CDC体系结构基于发布者/订阅者模型。发布者捕捉变化数据并提供给订阅者。订阅者使用从发布者那里获得的变化数据。
CDC几个概念:
源表(Source Table),业务数据库的需要捕获数据的源表
变化表(Change Table) ,保存从源表捕获的变化数据(包括各种DML产生的数据)
变化集(Change Set),是保证事务一致性的数据集合。一个变化集对应多个变化表
订阅视图(Subscription View),提供给读取变化表数据的视图
订阅窗口(Subscription Window) ,定义了查看变化数据的时间范围.就象一个观察变化数据的滑动窗口。变化数据处理完成后,可以对清除订阅窗口。
各种数据增量抽取机制的优劣性综合分析如表所示:
增量机制 |
兼容性 |
完备性 |
抽取性能 |
对源系统性能影响 |
对源系统倾入性 |
实现难度 |
触发器方式 |
关系型数据库 |
高 |
优 |
大 |
一般 |
较容易 |
时间戳方式 |
关系型数据库,具有“字段”结构的其它数据格式 |
低 |
较优 |
很小 |
大 |
较容易 |
全表删除插入方式 |
任何数据格式 |
高 |
极差 |
无 |
无 |
容易 |
全表比对方式 |
关系型数据库、文本格式 |
高 |
差 |
小 |
一般 |
一般 |
日志表方式 |
关系型数据库 |
高 |
优 |
小 |
较大 |
较容易 |
系统日志分析方式 |
关系型数据库 |
高 |
优 |
很小 |
较大 |
难 |
同步CDC方式 |
Oracle数据库9i以上 |
高 |
优 |
大 |
一般 |
较难 |
异步CDC方式 |
Oracle数据库9i以上 |
高 |
优 |
很小 |
一般 |
较难 |
闪回查询方式 |
Oracle数据库9i以上 |
高 |
较优 |
很小 |
无 |
较容易 |
上一篇: ETL学习笔记之二 实现篇(转)