[Oracle] CDC

博客首页 » Oracle CDC

发布于 23 Dec 2014 12:16
标签 blog
Oracle CDC(Change Data Capture)概述

http://blog.csdn.net/chensrao/article/details/6200338

Oracle CDC(Change Data Capture)概述
2011-02-22

一、增量数据采集概述
数据采集通常是指ETL过程中Extract-数据抽取部分。除了ETL外在不同应用系统之间通常也需要传递数据,在某些环境条件限制下不能将数据从一个系统直接移到另一个系统,只能借助文本来作为中间媒介传递数据,且文本的生成有时间窗口的限制,所以对数据采集即数据抽取的性能有一定的要求。对增加数据的采集的方法常用的有以下几种:

1. 时间戳(Timestamps on rows)

2. 版本号(Version Numbers on rows)

3. 状态指示(Status indicators on rows)

4. 时间戳、版本号、状态指示混合使用(Time/Version/Status on rows)

5. 触发器 (Triggers on tables)

6. 表差异(Table differencing)

7. 数据库的日志扫描(Log scanners on databases)

对于增量数据采集情况在Oracle中推出了两种主要方案,一种是我们熟悉的物化视图(materialized view),另一种就是本文将要介绍的CDC组件(Change Data Capture 改变数据捕获)。

CDC 特性是在Oracle9i数据库中引入的。CDC能够帮助你识别从上次提取之后发生变化的数据。利用CDC,在对源表进行INSERT、UPDATE或 DELETE等操作的同时就可以提取数据,并且变化的数据被保存在数据库的变化表中。这样就可以捕获发生变化的数据,然后利用数据库视图以一种可控的方式提供给目标系统。

二、CDC的发布订阅模型

CDC体系结构基于发布者/订阅者模型。发布者捕捉变化数据并提供给订阅者。订阅者使用从发布者那里获得的变化数据。通常,CDC系统拥有一个发布者和多个订阅者。发布者首先需要识别捕获变化数据所需的源表。然后,它捕捉变化的数据并将其保存在特别创建的变化表中。它还使订阅者能够控制对变化数据的访问。订阅者需要清楚自己感兴趣的是哪些变化数据。一个订阅者可能不会对发布者发布的所有数据都感兴趣。 订阅者需要创建一个订阅者视图来访问经发布者授权可以访问的变化数据。

CDC有几个重要的基本概念需要先明确一下:

l 源表(Source Table),业务数据库的需要捕获数据的源表

l 变化表(Change Table) ,保存从源表捕获的变化数据(包括各种DML产生的数据)

l 变化集(Change Set),是保证事务一致性的数据集合。一个变化集对应多个变化表

l 订阅视图(Subscription View),提供给读取变化表数据的视图

l 订阅窗口(Subscription Window) ,定义了查看变化数据的时间范围.就象一个观察变化数据的滑动窗口。变化数据处理完成后,可以对清除订阅窗口。

三、CDC的同步与异步模式

l 同步模式,实时的捕获变化数据并存储到变化表中,发布者与订阅都位于同一数据库中,同步模式实际使用trigger的形式来捕捉变化数据。下图说明了同步模式的基本架构。

clip_image002

l 异步模式,以Oracle流复制技术为基础,从redo log中读取日志记录来捕捉变化数据。异步模式有三种:

1. Asynchronous HotLog

clip_image004 2. Asynchronous Distributed HotLog

clip_image006

3. Asynchronous AutoLog Mode

3.1 Asynchronous Autolog Online Change Data Capture

clip_image008

3.2 Asynchronous AutoLog Archive Change Data Capture

clip_image010

四、CDC相关的数据库对象 (Package)

l 包(Package)

n DBMS_CDC_PUBLISH, 用于定义发布操作

n DBMS_CDC_SUBSCRIBE,用于定义订阅操作

l 角色

n EXECUTE_CATALOG_ROLE

n SELECT_CATALOG_ROLE

n CREATE TABLE and CREATE SESSION privileges

n EXECUTE on the DBMS_CDC_PUBLISH package

l 视图

n ALL_SOURCE_TABLES 源表

n ALL_PUBLISHED_COLUMNS 发布的表列

n All_Subscribed_Columns 订阅的表列

n All_Subscriptions 所有订阅

n All_Subscribed_Tables 已经订阅的表

五、CDC的实施步骤

同步模式以trigger形式来捕捉,这种实行没有自身来使用trigger来捕捉来的灵活,且其对性能的影响比从日志捕捉变化数据的性能影响大,所以本文以异步捕捉中的异步Hotlog来讲解CDC的具体实施步骤.

1. 准备数据和用户

SQL>show user

scott

SQL>create table t1 ( a_num number , b_varchar varchar2(10),c_char char(10));#测试表

SQL>conn / as sysdba

SQL>create user cdcpub identified by cdcpub; #发布用户(publisher)

SQL>create user subscriber1 identified by subscriber1;#订阅者(subscriber)

2. 调整数据库参数(需根据实际情况修改)

compatible = 10.2.0

java_pool_size = 50000000

job_queue_processes = 2

parallel_max_servers = + 5

processes = + 7

sessions = + 2

streams_pool_size = + 21 MB

undo_retention = 3600

3. 修改数据库日志模式

#数据库默认是在archivelog模式

SQL>show user

USER is “sys”

SQL>ALTER DATABASE FORCE LOGGING; #此步骤是可选但建议执行;

SQL>ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;#此步骤需执行;

SQL>ALTER TABLE scott.t1

ADD SUPPLEMENTAL LOG GROUP log_group_t1 (a_num,b_varchar,c_char) ALWAYS;

#若要捕捉t1表中所有列,可用下列语句代替上述alter table语句:

#ALTER TABLE scott.t1 ADD SUPPLEMENTAL LOG DATA (ALL) #COLUMNS;

4. 授权

ALTER USER cdcpub QUOTA UNLIMITED ON SYSTEM

QUOTA UNLIMITED ON SYSAUX;

GRANT CREATE SESSION TO cdcpub;

GRANT CREATE TABLE TO cdcpub;

GRANT CREATE TABLESPACE TO cdcpub;

GRANT UNLIMITED TABLESPACE TO cdcpub;

GRANT SELECT_CATALOG_ROLE TO cdcpub;

GRANT EXECUTE_CATALOG_ROLE TO cdcpub;

GRANT CREATE SEQUENCE TO cdcpub;

GRANT DBA TO cdcpub;

GRANT EXECUTE on DBMS_CDC_PUBLISH TO cdcpub;

EXECUTE DBMS_STREAMS_AUTH.GRANT_ADMIN_PRIVILEGE(GRANTEE => 'cdcpub');

5. 准备源表(Source Table)

SQL>show user

USER is “SYS”

SQL>

BEGIN

DBMS_CAPTURE_ADM.PREPARE_TABLE_INSTANTIATION(TABLE_NAME => 'scott.t1');

END;

/

6. 创建变更集(Change Set)

SQL>show user

USER is “cdcpub”

SQL>

BEGIN

DBMS_CDC_PUBLISH.CREATE_CHANGE_SET(

change_set_name => 'cdc_test_cs',

description => 'Change set for scott.t info',

change_source_name => 'HOTLOG_SOURCE',

stop_on_ddl => 'y'

);

END;

/

7. 创建变更表(Change Table)

SQL>show user

USER is “cdcpub”

SQL>

BEGIN

DBMS_CDC_PUBLISH.CREATE_CHANGE_TABLE(

owner => 'cdcpub',

change_table_name => 't1_ct',

change_set_name => 'cdc_test_cs',

source_schema => 'scott',

source_table => 't1',

column_type_list =>'a_num number,b_varchar varchar2(10),c_char char(10)',

capture_values => 'both',

rs_id => 'y',

row_id => 'n',

user_id => 'n',

timestamp => 'n',

object_id => 'n',

source_colmap => 'n',

target_colmap => 'y',

options_string => '');

END;

/

8. 激活变更集(Change Set)

SQL>show user

USER is “cdcpub”

SQL>

BEGIN

DBMS_CDC_PUBLISH.ALTER_CHANGE_SET(

change_set_name => 'cdc_test_cs',

enable_capture => 'y');

END;

/

9. 授权给订阅者

SQL>show user

USER is “cdcpub”

SQL> GRANT SELECT ON cdcpub.t1_ct TO subscriber1;

SQL>show user

USER is “SYS”

SQL>GRANT CREATE TABLE TO subscriber1;

SQL>GRANT CREATE SESSION TO subscriber1;

SQL>GRANT CREATE VIEW TO subscriber1;

SQL>GRANT UNLIMITED TABLESPACE TO subscriber1;

10. 订阅变更数据

i. 创建订阅集(subscription)

SQL>show user

USER is “subscriber1”

SQL>

BEGIN

DBMS_CDC_SUBSCRIBE.CREATE_SUBSCRIPTION(

change_set_name => 'cdc_test_cs',

description => 'Change data for t1',

subscription_name => 't1_sub');

END;

/

ii. 订阅源表及源表中的相关字段

SQL>show user

USER is “subscriber1”

SQL>

BEGIN

DBMS_CDC_SUBSCRIBE.SUBSCRIBE(

subscription_name => 't1_sub',

source_schema => 'scott',

source_table => 't1',

column_list => 'a_num,b_varchar,c_char',

subscriber_view => 't1_view');

END;

/

iii. 激活订阅

SQL>show user

USER is “subscriber1”

SQL>

BEGIN

DBMS_CDC_SUBSCRIBE.ACTIVATE_SUBSCRIPTION(

subscription_name => 't1_sub');

END;

/

iv. 扩展订阅窗口

SQL>show user

USER is “subscriber1”

SQL>

BEGIN

DBMS_CDC_SUBSCRIBE.EXTEND_WINDOW(

subscription_name => 't1_sub');

END;

/

#extend_window功能说明:此过程是设置订阅窗口的高位边界,只要设置

#了新数据才能看到新数据;

v. 查看订阅视图内容

SQL>show user

USER is “subscriber1”

SQL>select * from t1_view; #因scott.t1表中无数据变更所以当前视图无数据

no rows selected

SQL>conn scott/tiger

SQL> insert into t1 values(2,'cdc_test1','cdc');

SQL>commit;

SQL>conn subscriber1/subscriber1

SQL>

BEGIN

DBMS_CDC_SUBSCRIBE.EXTEND_WINDOW(

subscription_name => 't1_sub');

END;

/

SQL>select OPERATION$,a_num,b_varchar,c_char from t1_view

OP A_NUM B_VARCHAR C_CHAR

-- -- --

I 2 cdc_test1 cdc

vi. 清除变更集数据

如果当前变更数据不在需要使用,可以清除为后续生成的数据腾出空间;

BEGIN

DBMS_CDC_SUBSCRIBE.PURGE_WINDOW(

subscription_name => 'SALES_SUB');

END;

/

vii. 删除订阅:

如果当前订阅不需要再使用可以删除;

BEGIN

DBMS_CDC_SUBSCRIBE.DROP_SUBSCRIPTION(

subscription_name => 't1_sub');

END;

/

参考:

Oracle® Database Data Warehousing Guide 10g Release 2 (10.2) B14223-02 Chapter 16


本页面的文字允许在知识共享 署名-相同方式共享 3.0协议和GNU自由文档许可证下修改和再使用,仅有一个特殊要求,请用链接方式注明文章引用出处及作者。请协助维护作者合法权益。


系列文章

文章列表

  • Oracle CDC

这篇文章对你有帮助吗,投个票吧?

rating: 0+x

留下你的评论

Add a New Comment
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License