ORACLE CDC.docx
- 文档编号:12812500
- 上传时间:2023-06-08
- 格式:DOCX
- 页数:15
- 大小:50.13KB
ORACLE CDC.docx
《ORACLE CDC.docx》由会员分享,可在线阅读,更多相关《ORACLE CDC.docx(15页珍藏版)》请在冰点文库上搜索。
ORACLECDC
OracleCDC操作手册
Oracle的增量数据处理方案
中联新时代
1.CDC简介
1.1.CDC是一种数据增量处理技术
在构建数据仓库系统的ETL过程中,增量数据的抽取是一个非常关键的环节.对解决方案一般有两点要求:
●准确性,能够将业务系统中的数据按一定的频率准确的取到数据仓库中
●性能,不能对业务系统造成太大的压力,影响现有业务
目前,最为常用的ETL增量数据处理方式有三种:
●时间戳
●日志比照〔CDC〕
●全面数据比照
三种方式各有优劣,时间戳是目前应用比较普遍的方式。
在Oracle=中推出了两种主要的ETL方案,一种是我们熟悉的物化视图〔materializedview〕,另一种就是本文将要介绍的CDC组件〔ChangeDataCapture改变数据捕获〕。
CDC特性是在Oracle9i数据库中引入的。
CDC能够帮助你识别从上次提取之后发生变化的数据。
利用CDC,在对源表进行INSERT、UPDATE或DELETE等操作的同时就可以提取数据,并且变化的数据被保存在数据库的变化表中。
这样就可以捕获发生变化的数据,然后利用数据库视图以一种可控的方式提供给目标系统。
1.2.CDC与传统增量处理方式的比照分析
我们比照一下CDC方式与传统的全表比照与时间戳方式。
全表比照使用数据仓库中的当前表与业务系统表进行比照,取得变化了的数据,典型是使用minus语句:
SELECT*FROMnew_version
MINUSSELECT*FROMold_version;
使用全表比照有以下几方面的问题:
●需要将业务系统中表全部转输,造成很高的网络负载
●需要对两版本的表进行全表扫描,性能代价非常高
●无法反映数据的历史状态,如无法捕捉库存的历史变化记录
还有一种常用的方式是时间戳, 它是以业务表中某一个字段的值,作为判断新旧数据的标志。
如,〞病人费用记录〞中的登记时间,每次只抽取上次抽取记录时间以后产生的数据。
时间戳方式存在以下问题:
●无法捕获对时间戳以前数据的delete和update操作,在数据准确性上受到了一定的限制。
而类似于ZLHIS这种业务系统对已经发生的数据进行update和delete操作非常普遍〔如划价记录转收费记录〕,应用场景受到了限制。
●要求业务系统的表必须一个可以标识新旧数据的列,而某些表没有设置这种列。
1.3.CDC的发布订立模型
CDC体系结构基于发布者/订阅者模型。
发布者捕捉变化数据并提供给订阅者。
订阅者使用从发布者那里获得的变化数据。
通常,CDC系统拥有一个发布者和多个订阅者。
发布者首先需要识别捕获变化数据所需的源表。
然后,它捕捉变化的数据并将其保存在特别创立的变化表中。
它还使订阅者能够控制对变化数据的访问。
订阅者需要清楚自己感兴趣的是哪些变化数据。
一个订阅者可能不会对发布者发布的所有数据都感兴趣。
订阅者需要创立一个订阅者视图来访问经发布者授权可以访问的变化数据。
CDC有几个重要的根本概念需要先明确一下:
●源表〔SourceTable〕,业务数据库的需要捕获数据的源表
●变化表〔ChangeTable〕,保存从源表捕获的变化数据〔包括各种DML产生的数据〕
●变化集〔ChangeSet〕,是保证事务一致性的数据集合。
一个变化集对应多个变化表
●订阅视图〔SubscriptionView〕,提供给读取变化表数据的视图
●订阅窗口〔SubscriptionWindow〕,定义了查看变化数据的时间范围.就象一个观察变化数据的滑动窗口。
变化数据处理完成后,可以对去除订阅窗口。
1.4.CDC的同步与异步模式
●同步模式,实时的捕获变化数据并存储到变化表中,发布者与订阅都位于同一数据库中。
以以下图说明了同步模式的根本架构。
●异步模式,以Oracle流复制技术为根底,由于流复制比较复杂,本文档不涉及异步模式的CDC
1.5.CDC相关的数据库对象〔Package〕
●包〔Package〕
⏹DBMS_CDC_PUBLISH,用于定义发布操作
⏹DBMS_CDC_SUBSCRIBE,用于定义订阅操作
●角色
⏹EXECUTE_CATALOG_ROLE
⏹SELECT_CATALOG_ROLE
⏹CREATETABLEandCREATESESSIONprivileges
⏹EXECUTEontheDBMS_CDC_PUBLISHpackage
●视图
⏹ALL_SOURCE_TABLES源表
⏹ALL_PUBLISHED_COLUMNS发布的表列
⏹All_Subscribed_Columns订阅的表列
⏹All_Subscriptions所有订阅
⏹All_Subscribed_Tables已经订阅的表
2.CDC的实施步骤
2.1.初始化
2.1.1.设置初始化参数
由于CDC需要在后台开启作业,需要将参数JOB_QUEUE_PROCESSES增加2个,java_pool_size至少在50M以上。
SQL>altersystemsetjob_queue_processes=14;
Systemaltered
SQL>altersystemsetjava_pool_size=50m;
Systemaltered
SQL>
2.1.2.创立订阅、发布用户、表空间
size100m;
Tablespacecreated
SQL>createusercdc_publisheridentifiedbycdc_publisherdefaulttablespacets_cdcpub;
Usercreated
SQL>createusercdc_subcriberidentifiedbycdc_subcriberdefaulttablespacets_cdcpub;
Usercreated
2.1.3.授予相关权限
SQL>GRANTCREATESESSIONTOcdc_publisher;
Grantsucceeded
SQL>GRANTCREATETABLETOcdc_publisher;
Grantsucceeded
SQL>GRANTCREATETABLESPACETOcdc_publisher;
Grantsucceeded
SQL>GRANTUNLIMITEDTABLESPACETOcdc_publisher;
Grantsucceeded
SQL>GRANTSELECT_CATALOG_ROLETOcdc_publisher;
Grantsucceeded
SQL>GRANTEXECUTE_CATALOG_ROLETOcdc_publisher;
Grantsucceeded
SQL>GRANTEXECUTEONDBMS_CDC_PUBLISHTOcdc_publisher;
Grantsucceeded
2.1.4.在ZLHIS用户下,创立测试表
SQL>CreateTableperson〔idNumber,NameVarchar〔10〕,sexVarchar〔2〕〕;
Tablecreated
SQL>insertintopersonvalues〔0,'毛泽东','男'〕;
1rowinserted
SQL>insertintopersonvalues〔0,'彭德怀','男'〕;
1rowinserted
SQL>insertintopersonvalues〔0,'邓颖操','女'〕;
1rowinserted
SQL>commit;
Commitcomplete
SQL>grantallonpersontocdc_publisher;
Grantsucceeded
SQL>grantallonpersontocdc_subscriber;
Grantsucceeded
2.2.发布数据
2.2.1.创立改变集
在同步方式的CDC中,change_source_name参数必须使用默认的改变源,SYNC_SOURCE
SQL>BEGIN
2DBMS_CDC_PUBLISH.CREATE_CHANGE_SET〔
3change_set_name=>'person_change_set',--改变集
4description=>'Changesetforpersoninfo',
5change_source_name=>'SYNC_SOURCE'〕;
6END;
7/
PL/SQLproceduresuccessfullycompleted
SQL>
2.2.2.创立改变表
指定源table,和源模式,注意区别owner与source_schema,owner是指发布用户,而不是源表的所有者
SQL>BEGIN
2DBMS_CDC_PUBLISH.CREATE_CHANGE_TABLE〔
3owner=>'cdc_publisher',
4change_table_name=>'person_ct',
5change_set_name=>'person_change_set',
6source_schema=>'zlhis',
7source_table=>'person',
8column_type_list=>'IDnumber,NAMEVARCHAR2〔10〕,sexvarchar2〔2〕',
9capture_values=>'both',
10rs_id=>'y',
11row_id=>'n',
12user_id=>'n',
13timestamp=>'n',
14object_id=>'n',
15source_colmap=>'y',
16target_colmap=>'y',
17options_string=>'TABLESPACETS_CDCPUB'〕;
18END;
19/
PL/SQLproceduresuccessfullycompleted
SQL>
options_string,指定改变表的存储参数。
options_string参数可以使用除partition以外的所有createtable 中指定的存储参数,如tablespace、pctfree 等。
2.2.3.将改变表〔ChangeTable〕的权限授权给订阅者
SQL>grantselectonperson_cttocdc_subscriber;
Grantsucceeded
2.3.订阅数据
2.3.1.查看发布信息
当发布者,发布了相关的改变表后,会生成一个惟一的发布id〔publicationID〕, 可以查阅视图ALL_PUBLISHED_COLUMNS以获取已经发布的表及字段信息
SQL>selectchange_set_name,pub_id,source_table_namefromALL_PUBLISHED_COLUMNS;
CHANGE_SET_NAMEPUB_IDSOURCE_TABLE_NAME
----------------------------------------------------------------------
PERSON_CHANGE_SET70403PERSON
PERSON_CHANGE_SET70403PERSON
PERSON_CHANGE_SET70403PERSON
6rowsselected
SQL>
2.3.2.创立订阅
使用DBMS_CDC_SUBSCRIBE.CREATE_SUBSCRIPTION创立订阅操作,一次订阅与改变集对应,由于改变集与源表之间是一对多的关系,所以一次订阅就可以订阅多张表.
SQL>BEGIN
2DBMS_CDC_SUBSCRIBE.CREATE_SUBSCRIPTION〔
3change_set_name=>'PERSON_CHANGE_SET',
4description=>'Changedataforperson',
5subscription_name=>'PERSON_SUB'〕;
6END;
7/
PL/SQLproceduresuccessfullycompleted
2.3.3.订阅表,如果改变集中有多个表,需要操作屡次
SQL>BEGIN
2DBMS_CDC_SUBSCRIBE.SUBSCRIBE〔
3subscription_name=>'PERSON_SUB',
4source_schema=>'zlhis',
5source_table=>'person',
6column_list=>'id,name,sex',
7subscriber_view=>'PERSON_VIEW'〕;
8END;
9/
PL/SQLproceduresuccessfullycompleted
SQL>
2.4.激活订阅
订阅需要使用DBMS_CDC_SUBSCRIBE.ACTIVATE_SUBSCRIPTION进行激活,才能生生效,激活订阅后CDC就开始捕获改变数据.
SQL>Begin
2dbms_cdc_subscribe.activate_subscription〔subscription_name=>'PERSON_SUB'〕;
3END;
4/
PL/SQLproceduresuccessfullycompleted
2.5.扩展窗口的应用〔查看增量的数据〕
订阅都调用DBMS_CDC_SUBSCRIBE.EXTEND_WINDOW过程取得改变数据的集合,如果第一次执行,就取得激活订阅后所有改变数据.每次执行DBMS_CDC_SUBSCRIBE.EXTEND_WINDOW后,扩展窗口只看到上次执行DBMS_CDC_SUBSCRIBE.EXTEND_WINDOW至今的数据.
SQL>BEGIN
2DBMS_CDC_SUBSCRIBE.EXTEND_WINDOW〔
3subscription_name=>'PERSON_SUB'〕;
4END;
5/
PL/SQLproceduresuccessfullycompleted
2.6.测试及查看改变数据
--以zlhis登录,改变测试表数据
SQL>connectzlhis/his@117orc1;
ConnectedtoOracleDatabase10gEnterprise
Connectedaszlhis
SQL>select*fromperson;
IDNAMESEX
-----------------------
0毛泽东男
0彭德怀男
0邓颖操女
SQL>insertintopersonvalues〔'1','刘少奇','男'〕;
1rowinserted
SQL>updatepersonsetname='毛主席'wherename='毛泽东';
1rowupdated
SQL>deletefrompersonwherename='刘少奇';
1rowdeleted
SQL>commit;
Commitcomplete
--以订立用户查看改变数据
SQL>connectcdc_subscriber/cdc_subscriber@117orc1;
ConnectedtoOracleDatabase10gEnterprise
Connectedascdc_subscriber
--直接查看改变数据视图是看不到的,必须执行dbms_cdc_subscribe.extend_window〔'PERSON_SUB'〕,以确定扩展窗口
SQL>select*fromperson_view;
OPERATION$CSCN$COMMIT_TIMESTAMP$RSID$SOURCE_COLMAP$TARGET_COLMAP$IDNAMESEX
-------------------------------------------------------------------------------------------------------------------
SQL>begin
2dbms_cdc_subscribe.extend_window〔'PERSON_SUB'〕;
3end;
4/
PL/SQLproceduresuccessfullycompleted
--捕获的改变数据
SQL>select*fromperson_view;
OPERATION$CSCN$COMMIT_TIMESTAMP$RSID$SOURCE_COLMAP$TARGET_COLMAP$IDNAMESEX
--------------------------------------------------------------------------------------------------------
I1058807720**-6-12上午1110E000000000000000FE030000000000000000000001刘少奇男
UU1058807720**-6-12上午112040000000000000007E000000000000000000000000毛泽东男
D1058807720**-6-12上午113000000000000000007E000000000000000000000001刘少奇男
SQL>
可以看到订阅视图中包括了改变数据、操作类型〔update、delete或insert〕,操作时间,我们可以根据自己的需要提取改变数据进行处理。
2.7.清空扩展窗口
使用扩展窗口的数据可以进行清空操作,防止改变数据过多带来的系统负载。
SQL>BEGIN
2DBMS_CDC_SUBSCRIBE.PURGE_WINDOW〔
3subscription_name=>'PERSON_SUB'〕;
4END;
5/
PL/SQLproceduresuccessfullycompleted
SQL>
总结一下,同步模式下的CDC配置还是比较简单的:
●修改初始化参数
●创立订阅、发布用户和存储的表空间
●授予相关权限
●创立改变集
●建立改变表
●订阅发布数据,创立订阅
●订阅发布的表
●扩展窗口,以查阅改变数据
3.CDC的性能测试
我们使用sql_trace工具比照应用了CDC捕获改变表数据与未设置CDC的表插入同样的数据进行性能比照。
--创立与测试表结构相同的表
SQL>createtableperson_tempasselect*fromperson;
表已创立。
SQL>altersessionsetsql_trace=true;
会话已更改。
--开启sql-trace,分别插入相同的数据
SQL>insertintopersonselectobject_id,substr〔object_name,1,0〕,'s'fromdba_objects;
已创立57674行。
统计信息
----------------------------------------------------------
0recursivecalls
0dbblockgets
0consistentgets
0physicalreads
0redosize
0bytessentviaSQL*Nettoclient
0bytesreceivedviaSQL*Netfromclient
0SQL*Netroundtripsto/fromclient
0sorts〔memory〕
0sorts〔disk〕
57674rowsprocessed
SQL>insertintoperson_tempselectobject_id,substr〔object_name,1,0〕,'s'fromdba_objects;
已创立57674行。
统计信息
----------------------------------------------------------
0recursivecalls
0dbblockgets
0consistentgets
0physicalreads
0redosize
0bytessentviaSQL*Nettoclient
0bytesreceivedviaSQL*Netfromclient
0SQL*Netroundtripsto/fromclient
0sorts〔memory〕
0sorts〔disk〕
57674rowsprocessed
SQL>commit;
从统计信息来看,两者并无差异。
我们再看一下两者的sql_trace记录:
插入Person表的trace记录
insertintopersonselectobject_id,substr〔object_name,1,0〕,'s'fromdba_objects
callcountcpuelapseddiskquerycurrentrows
-----------------------------------------------------------------------
Parse20.030.020000
Execute20.6019.502425089118728115348
Fetch00.000.000000
-----------------------------------------------------------------------
total40.6419.522425089118728115348
Missesinlibrarycacheduringparse:
1
Optimizermode:
ALL_ROWS
Parsinguseri
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ORACLE CDC
![提示](https://static.bingdoc.com/images/bang_tan.gif)