1. CDC简介
1.1. CDC是一种数据增量处理技术
在构建数据仓库系统的ETL过程中,增量数据的抽取是一个非常关键的环节.对解决方案一般有两点要求:
1) 准确性,能够将业务系统中的数据按一定的频率准确的取到数据仓库中
2) 性能,不能对业务系统造成太大的压力,影响现有业务
目前,最为常用的ETL增量数据处理方式有三种:
1) 时间戳
2) 日志对比(CDC)
3) 全面数据对比
三种方式各有优劣,时间戳是目前应用比较普遍的方式。
在Oracle中推出了两种主要的ETL方案,一种是我们熟悉的物化视图(materialized view),另一种就是本文将要介绍的CDC组件(Change Data Capture 改变数据捕获)。
CDC 特性是在Oracle9i数据库中引入的。CDC能够帮助你识别从上次提取之后发生变化的数据。利用CDC,在对源表进行INSERT、UPDATE或 DELETE等操作的同时就可以提取数据,并且变化的数据被保存在数据库的变化表中。这样就可以捕获发生变化的数据,然后利用数据库视图以一种可控的方式提供给目标系统。
1.2. CDC与传统增量处理方式的对比分析
我们对比一下CDC方式与传统的全表对比与时间戳方式。
1.2.1. 全表对比
全表对比使用数据仓库中的当前表与业务系统表进行对比,取得变化了的数据,典型是使用minus语句:
SELECT * FROM new_version MINUS SELECT * FROM old_version;
使用全表对比有以下几方面的问题:
1) 需要将业务系统中表全部转输,造成很高的网络负载
2) 需要对两版本的表进行全表扫描,性能代价非常高
3) 无法反映数据的历史状态,如无法捕捉库存的历史变化记录
1.2.2. 时间戳
还有一种常用的方式是时间戳, 它是以业务表中某一个字段的值,作为判断新旧数据的标志。如,”病人费用记录”中的登记时间,每次只抽取上次抽取记录时间以后产生的数据。时间戳方式存在以下问题:
1) 无法捕获对时间戳以前数据的delete和update操作,在数据准确性上受到了一定的限制。
2) 要求业务系统的表必须一个可以标识新旧数据的列,而某些表没有设置这种列。
1.2.3. CDC
1.2.3.1. CDC的发布订阅模型
CDC(change data capture)体系结构基于发布者/订阅者模型。发布者捕捉变化数据并提供给订阅者。订阅者使用从发布者那里获得的变化数据。通常,CDC系统拥有一个发布者和多个订阅者。发布者首先需要识别捕获变化数据所需的源表。然后,它捕捉变化的数据并将其保存在特别创建的变化表中。它还使订阅者能够控制对变化数据的访问。订阅者需要清楚自己感兴趣的是哪些变化数据。一个订阅者可能不会对发布者发布的所有数据都感兴趣。订阅者需要创建一个订阅者视图来访问经发布者授权可以访问的变化数据。
CDC有几个重要的基本概念需要先明确一下:
1) 源表(Source Table),业务数据库的需要捕获数据的源表
2) 变化表(Change Table) ,保存从源表捕获的变化数据(包括各种DML产生的数据)
3) 变化集(Change Set),是保证事务一致性的数据集合。一个变化集对应多个变化表
4) 订阅视图(Subscription View),提供给读取变化表数据的视图
5) 阅窗口(Subscription Window) ,定义了查看变化数据的时间范围.就象一个观察变化数据的滑动窗口。变化数据处理完成后,可以清除订阅窗口。
1.2.3.2. CDC的同步与异步模式
1) 同步机制(Synchronous Change Data Capture Configuration)
原理很简单,原表、目标表必须是同一个库,采用触发器的机制(设置同步CDC后,并看不到触发器,但实际运行机理还是触发器的机制)将原表内容复制到另一个目标表。这个机制就不多说了,和自己给表建触发器没什么太大差别。
2) 异步在线日志CDC(Asynchronous HotLog Configuration)
这个过程已经没有触发器了,而是使用Redo Log,但是使用在线日志,并不是归档日志。并且原表、目标表仍然必须是同一个库。这种模式是相对简单的,同时这种模式是在Oracle 10以上才产生的,9i是没有这个机制的。
3) 异步分布式CDC (Asynchronous Distributed HotLog Configuration)
实际这个模式是对异步在线日志CDC的一种优化,也比较容易理解,就是加入了DB-LINK机制,使原表、目标表不在同一个数据库。实际是和异步在线日志CDC没有什么本质区别。
4) 异步在线日志复制CDC(Asynchronous Autolog Online Change Data Capture Configuration)
. 异步在线日志复制CDC模式就要高级很多了,使用Standby Redo Log(热备数据库日志),实际就是使用Oracle的热备机制,将日志写入了热备数据库,目标表就可以建立在热备库上,这对主数据库性能影响就进一步降低。
5) 归档日志CDC (Asynchronous AutoLog Archive Change Data Capture Configuration)
归档日志CDC模式是最完美的模式,但是需要有机制可以获取归档日志(并行文件系统技术),然后在目标端分析归档日志进行变化数据处理,这种模式理论上来讲,几乎可以完全不影响原数据库的性能。
影响更改数据捕获模式选择的因素
模式 | 临时数据库的位置、硬件和软件 | 捕获机制 | 源数据库性能影响 |
同步 | 位置必须与源数据库相同, 因此硬件、操作系统和 Oracle 数据库版本与源系统相同。 | 更改数据将作为它所反映的同一事务的一部分自动提交。 | 将开销添加到源数据库事务以执行更改数据捕获。 |
异步 HotLog | 位置必须与源数据库相同, 因此硬件、操作系统和 Oracle 数据库版本与源系统相同。 | 更改数据是从当前的联机重做日志文件中捕获的。更改集将在提交新事务时自动填充。 | 对源数据库事务的影响最小, 以执行补充日志记录。执行更改数据捕获所需的其他源数据库开销。 |
异步分布式 HotLog | 位置从源数据库中远程。硬件、操作系统和 Oracle 数据库版本可以与源系统不同。 | 更改数据是从当前的联机重做日志文件中捕获的。当新提交的事务到达临时数据库时, 将自动填充更改集。 | 对源数据库事务的影响最小, 以执行补充日志记录。 在挖掘联机重做日志文件时, 源数据库上的一些开销会发生。 |
异步 AutoLog 在线 | 位置从源数据库中远程。硬件、操作系统和 Oracle 数据库版本与源系统相同。 | 从备用重做日志文件中捕获更改数据。当新提交的事务到达临时数据库时, 将自动填充更改集。 | 对源数据库事务的影响最小, 以执行补充日志记录。 恢复传输服务的最小源数据库开销。 |
异步 AutoLog 存档 | 位置从源数据库中远程。硬件、操作系统和 Oracle 数据库版本与源系统相同。 | 更改数据是从已存档的重做日志文件中捕获的。更改集将自动填充, 因为已存档的重做日志文件到达临时数据库。 | 对源数据库事务的影响最小, 以执行补充日志记录。 恢复传输服务的最小源数据库开销。 |
1.2.3.3. CDC相关的数据库对象
1) 包(Package)
DBMS_CDC_PUBLISH, 用于定义发布操作
DBMS_CDC_SUBSCRIBE,用于定义订阅操作
2) 角色
EXECUTE_CATALOG_ROLE
SELECT_CATALOG_ROLE
CREATE TABLE and CREATE SESSION privileges
EXECUTE on the DBMS_CDC_PUBLISH package
3) 视图
ALL_SOURCE_TABLES源表
ALL_PUBLISHED_COLUMNS发布的表列
All_Subscribed_Columns订阅的表列
All_Subscriptions 所有订阅
All_Subscribed_Tables 已经订阅的表
1.2.3.4. CDC 不支持的数据对象
支持同步更改数据捕获的类型和表结构
同步更改数据捕获支持所有内置 Oracle 类型的列, 但以下情况除外:
1) BFILE
2) BLOB
3) CLOB
4) LONG
5) NCLOB
6) ROWID
7) UROWID
8) 对象类型 (例如, XMLType)
9) 虚拟列。
10) 使用带引号的标识符
11) 使用带有更改数据捕获的保留关键字。有关保留关键字的列表, 请参见Oracle 数据库 SQL 语言参考。
同步更改数据捕获不支持下列表结构:
1) 作为临时表的源表
2) 作为对象表的源表
3) 具有不受支持的数据类型 (包括LOB列) 或溢出段的列的索引组织表
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29519108/viewspace-2150973/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29519108/viewspace-2150973/