一、CDC技术介绍
1、技术背景
CDC(数据变更捕获)最初是由ORACLE实现的,在数据库级别实现的增量抽取解决方案。
在CDC之前,在OLAP(联机分析处理)和ETL(数据仓库技术)开发中,对于增量抽取主要有如下几种方法:
① 时间截
在源表上增加一个时间戳字段,系统中更新修改表数据的时候,同时修改时间戳字段的值。当进行数据抽取时,通过比较上次抽取时间与时间戳字段的值来决定抽取哪些数据。
部分数据库不支持时间戳自动更新,即表中数据发生改变时,不会自动更新时间戳字段的值,这就要求业务系统在更新业务数据时,手工更新时间戳字段。
优点:时间戳性能较好,结构清晰,实现简单,可以实现数据的递增加载。
缺点:添加字段对数据表有较大侵入性,尤其是在已经完成并正在使用的功能上,突然添加一个字段,需要考虑业务系统是否受到影响;对不支持时间戳的自动更新的数据库,还要求业务系统进行额外的更新时间戳操作,增加处理逻辑;时间戳无法捕捉delete 操作,在数据准确性上受到了一定的限制。
上述缺点需要结合业务需要,分析能否采用时间戳方式实现增量抽取。
② 触发器
在要抽取的表上建立触发器,一般要建立插入、修改、删除三个触发器,同时根据需要决定是否借助于临时表。
每当源表中的数据发生变化,就被相应的触发器将变化的数据写入一个临时表,抽取线程从临时表中抽取数据,临时表中抽取过的数据被标记或删除。
优点:触发器性能高、实时性好,仓库处理规则简单,不需要修改业务系统表结构,可以实现数据的递增加载。
缺点:要求对监控表建立触发器,对业务系统有一定的影响,破坏数据库业务逻辑,容易对源数据库构成威胁,,同时增加了维护的复杂程度。
③ 全表对比方式
全表比对的方式是借助ETL 工具事先为要抽取的表建立一个结构类似的临时表,该临时表记录源表主键以及根据所有字段的数据计算出来,每次进行数据抽取前,对源表和临时表进行的比对,如有不同,进行增、删、改操作,例如目标表没有存在该主键值,表示该记录还没有,即进行Insert 操作。
优点:对已有系统表结构不产生影响,不需要修改业务操作程序,所有抽取规则由ETL完成,管理维护统一,可以实现数据的递增加载,没有风险。
缺点:比对过程较复杂,设计较为复杂,速度较慢。与触发器和时间戳方式中的主动通知不同,全表比对方式是被动的进行全表数据的比对,性能较差。当表中没有主键或唯一列且含有重复记录时,全表比对方式的准确性需要单独处理。
④ 日志表方式
在业务系统中添加系统日志表,当业务数据发生变化时,更新维护日志表内容,当作ETL 加载时,通过读日志表数据决定加载那些数据及如何加载。
优点:不需要修改业务系统表结构,源数据抽取清楚,速度较快。可以实现数据的递增加载。
缺点:日志表维护需要由业务系统完成,需要对业务系统业务操作程序作修改,记录日志信息。日志表维护较为麻烦,对原有系统有较大影响。工作量较大,改动较大,有一定风险。
⑤ 全表读取数据
每次获取数据时时均全量获取。
优点:加载规则简单,维护简单。
缺点:重复读取数据,性能差,一般不用。
2、CDC的出世
上述的各种捕获变更数据,都是采用在应用程序中实现自定义跟踪机制。 这些自定义机制通常要求对跟踪的表进行架构更改,或者使用触发器。为了满足数据迁移和数据抽取的业务需要,使得有机会在数据库层面上直接实现增量抽取功能,ORACLE综合性能和场景需要,在数据库引擎层面直接集成了CDC功能,由于提供了类似API的功能接口,变更数据捕获和更改跟踪均不要求在源中进行任何架构更改或使用触发器,所以比第三方工具具有一定的优势。利用CDC捕获变更有以下特点:
① 性能影响小。使用异步进程捕获,通过进程读取事务日志,对系统造成的影响很小,不对业务系统造成太大的压力,影响现有业务。
② 监控范围大。对该表的所有DML和DDL操作都会被记录,有助于跟踪表的变化,实现表操作的追根溯源。
③ 操作简单 。CDC是在数据库引擎中添加的功能,封装在数据库中,类似于A