博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

关于Change Data Capture(四)

Posted on 2010-03-08 11:49  徐正柱-  阅读(746)  评论(0)    收藏  举报

本系列第二和第三篇文章演示了同步CDC和异步HotLog CDC的实现,这两种模式都是在source database中捕获增量数据,所以配置只涉及到一个数据库,相对来说比较简单。而异步CDC的另外两种模式:Distributed HotLog和AutoLog,需要分别配置source database和staging datase,捕获增量数据主要是在staging database中执行,以尽可能的少影响source database的性能。

异步CDC主要是通过stream的技术来实现的,基本上是将Streams的一些配置步骤做了一层封装。如果对于Streams的配置很熟悉的话,配置异步CDC应该说还是一件比较简单的事情。

本文将演示异步Distribute HotLog的配置。文中Source database=ning,Staging Database=test。

一.版本

SYS@ning>select * fromv$version;
 
BANNER
--------------------------------------------------------------------
--
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Prod

PL/SQLRelease10.2.0.3.0 - Production
CORE    10.2.0.3.0      Production
TNSfor32-bitWindows: Version10.2.0.3.0 - Production
NLSRTLVersion10.2.0.3.0 - Production


二.设置发布者

1.在source database创建一个用户,并授予相应的权限。

SYS@ning>createusercdcpubidentifiedbycdcpub;
 
Usercreated.
 
SYS@ning>grantexecute_catalog_roletocdcpub;
 
Grantsucceeded.
 
SYS@ning>grantselect_catalog_roletocdcpub;
 
Grantsucceeded.
 
SYS@ning>grantcreatetabletocdcpub;
 
Grantsucceeded.
 
SYS@ning>grantcreatesessiontocdcpub;
 
Grantsucceeded.
 
SYS@ning>grantdbatocdcpub;
 
Grantsucceeded.
 
SYS@ning>grantexecuteondbms_cdc_publishtocdcpub;
 
Grantsucceeded.
 
SYS@ning>executedbms_streams_auth.grant_admin_privilege(grantee=>'cdcpub');
 
PL/SQLproceduresuccessfullycompleted.

2.在Staging database创建一个用户,并授予相应权限。

SYS@test>createusercdcpubidentifiedbycdcpub;
 
Usercreated.
 
SYS@test>grantcreatesessiontocdcpub;
 
Grantsucceeded.
 
SYS@test>grantcreatetabletocdcpub;
 
Grantsucceeded.
 
SYS@test>grantunlimitedtablespacetocdcpub;
 
Grantsucceeded.
 
SYS@test>grantselect_catalog_roletocdcpub;
 
Grantsucceeded.
 
SYS@test>grantexecute_catalog_roletocdcpub;
 
Grantsucceeded.
 
SYS@test>grantdbatocdcpub;
 
Grantsucceeded.
 
SYS@test>executedbms_streams_auth.grant_admin_privilege(grantee=>'cdcpub');
 
PL/SQLproceduresuccessfullycompleted.

三.设置Source Database的初始化参数

根据文档推荐,为source database设置如下初始化参数:

COMPATIBLE=9.2.0或者10.1.0或者10.2.0 根据source database的版本确定
JAVA_POOL_SIZE=50000000
OPEN_LINKS=4 或者更高
JOB_QUEUE_PROCESSES=(当前值) + 2
PARALLEL_MAX_SERVERS=(当前值) + (5 * (change set数目))
PROCESSES=(当前值) + (7 * (change set数目))
SESSIONS=(当前值) + (2 * (change set数目))
STREAMS_POOL_SIZE=Max(当前值,50 MB) + ((change set数目) * (21 MB))
UNDO_RETENTION=3600

根据网络配置确定是否需要设置GLOBAL_NAMES=TRUE

如果source database是9iR2则还需要设置如下参数

LOGMNR_MAX_PERSISTENT_SESSIONS=chang source数目

四.设置Staging database的初始化参数

COMPATIBLE=10.2.0 staging database必须是10gR2版本
JAVA_POOL_SIZE=50000000
OPEN_LINKS=4 或者更高
JOB_QUEUE_PROCESSES=(当前值) + 2
PARALLEL_MAX_SERVERS=(当前值) + (5 * (change set数目))
PROCESSES=(当前值) + (7 * (change set数目))
SESSIONS=(当前值) + (2 * (change set数目))
STREAMS_POOL_SIZE=Max(当前值,50 MB) + ((change set数目) * (21 MB))


五.发布变化数据

1.配置网络,一边source database和staging database可以相互访问

1.例如要发布source database用户ning下的sales表

SYS@ning>descning.sales;
 
Name                                      Null?    Type
 ---------------------------------------
-- -------- ----------------------------
 
ID                                                 NUMBER(38)
 
PRODUCTID                                          NUMBER(38)
 
PRICE                                              NUMBER(10,2)
 
QUANTITY                                           NUMBER(38)

2.授予cdcpub用户对于该表的权限

SYS@ning>grantallonning.salestocdcpub;
 
Grantsucceeded.

3.将Source Database置于Force logging

由于异步模式是从redo logfile中获得增量数据的,那么nologging操作就会影响到数据的捕捉,所以最好能

将数据库置于force logging模式。

SYS@ning>alterdatabaseforcelogging;
 
Databasealtered.

为了捕获update操作中各个column的redo数据,必须在数据库级别启用supplimental日志模式。

SYS@ning>alterdatabaseaddsupplementallogdata;
 
Databasealtered.

同时在源表上为需要捕捉的列创建supplemental日志组

SYS@ning>altertablening.sales
 
2  addsupplementalloggrouplog_group_sales
 
3  (id,productid,price,quantity);
 
Tablealtered.

如果打算捕捉所有列,也可以为所有列创建supplemental日志组

SYS@ning>altertablening.sales
 
2  addsupplementallogdata(all)columns;
 
Tablealtered.

4.在source database创建到staging database的database link

SYS@ning>conncdcpub/cdcpub
Connected.
CDCPUB@ning>createdatabaselinktest
 
2  connecttocdcpubidentifiedbycdcpubusing'test';
 
Databaselinkcreated.

5.在staging database创建到source database的database link

SYS@test>conncdcpub/cdcpub
Connected.
CDCPUB@test>createdatabaselinkning
 
2  connecttocdcpubidentifiedbycdcpubusing'ning';
 
Databaselinkcreated.

注意database link的名字要和using的tnsname一致,一开始我使用了不同的名字,结果在后面创建change source的时候一直报错

ERROR at line 1:
ORA-26675: cannot create Streams capture process CDC$C_NING
ORA-06512: at “SYS.DBMS_CAPTURE_ADM_INTERNAL”, line 121
ORA-06512: at line 1
ORA-06512: at “SYS.DBMS_CDC_IPUBLISH”, line 133
ORA-06512: at “SYS.DBMS_CDC_PUBLISH”, line 194
ORA-06512: at line 2

郁闷了我大半个小时,后来将database link改成和tnsname一致后就没有这个错误了。

6.在staging database中创建change source

CDCPUB@test>begin
 
2  dbms_cdc_publish.create_hotlog_change_source(
 
3  change_source_name=>'ning',
 
4  description=>'distributed hotlog source',
 
5  source_database=>'ning');
 
6  end;
 
7  /
 
PL/SQLproceduresuccessfullycompleted.

7.在staging database中创建change set

CDCPUB@test>begin
 
2  dbms_cdc_publish.create_change_set(
 
3  change_set_name=>'ning_sales_dhotlog',
 
4  description=>'dhotlog change set for ning.sales',
 
5  change_source_name=>'ning',
 
6  stop_on_ddl=>'y');
 
7  end;
 
8  /
 
PL/SQLproceduresuccessfullycompleted.

8.在staging database中创建change table

CDCPUB@test>begin
 
2  dbms_cdc_publish.create_change_table(
 
3  owner=>'cdcpub',
 
4  change_table_name=>'sales_ct_dhotlog',
 
5  change_set_name=>'ning_sales_dhotlog',
 
6  source_schema=>'ning',
 
7  source_table=>'sales',
 
8  column_type_list=>'id int,productid int,price number(10,2),quantity int',
 
9  capture_values=>'both',
 
10  rs_id=>'y',
 
11  row_id=>'n',
 
12  user_id=>'n',
 
13  timestamp=>'n',
 
14  object_id=>'n',
 
15  source_colmap=>'n',
 
16  target_colmap=>'y',
 
17  options_string=>'tablespace users');
 
18  end;
 
19  /
begin
*
ERRORatline1:
ORA-29540: classoracle/CDC/PublishApidoesnotexist
ORA-06512: at"SYS.DBMS_CDC_PUBLISH", line611
ORA-06512: atline2

faint,真是多灾多难,又出错了。Google了下, jlandzpa也遇到过这个问题,他是删除了CDC组件重装后解决的该问题。应该是staging database安装的时候CDC的编译出了问题,有个api的类没有正确编译。

CDCPUB@test>conn / assysdba
Connected.
SYS@test>@$ORACLE_HOME\rdbms\admin\rmcdc.sql
 
SYS@test>@$ORACLE_HOME\rdbms\admin\initcdc.sql

继续执行,ok

SYS@test>conncdcpub/cdcpub
Connected.
 
CDCPUB@test>begin
 
2  dbms_cdc_publish.create_change_table(
 
3  owner=>'cdcpub',
 
4  change_table_name=>'sales_ct_dhotlog',
 
5  change_set_name=>'ning_sales_dhotlog',
 
6  source_schema=>'ning',
 
7  source_table=>'sales',
 
8  column_type_list=>'id int,productid int,price number(10,2),quantity int',
 
9  capture_values=>'both',
 
10  rs_id=>'y',
 
11  row_id=>'n',
 
12  user_id=>'n',
 
13  timestamp=>'n',
 
14  object_id=>'n',
 
15  source_colmap=>'n',
 
16  target_colmap=>'y',
 
17  options_string=>'tablespace users');
 
18  end;
 
19  /
 
PL/SQLproceduresuccessfullycompleted.

9.在staging database中启用change source

CDCPUB@test>begin
 
2  dbms_cdc_publish.alter_hotlog_change_source(
 
3  change_source_name=>'ning',
 
4  enable_source=>'Y');
 
5  end;
 
6  /
 
PL/SQLproceduresuccessfullycompleted.

10.在staging database中启用change set

CDCPUB@test>begin
 
2  dbms_cdc_publish.alter_change_set(
 
3  change_set_name=>'ning_sales_dhotlog',
 
4  enable_capture=>'y');
 
5  end;
 
6  /
 
PL/SQLproceduresuccessfullycompleted.

查看alert日志,发现streams的capture和apply进程已经启动成功

Streams APPLY A001 started with pid=14, OS id=2904
Streams Apply Reader started P000 with pid=20 OS id=3912
Streams Apply Server started P001 with pid=21 OS id=2448

11.在staging database中将change table的读取权限授予订阅者

先创建订阅者帐号,然后授权

CDCPUB@test>createusercdcsubidentifiedbycdcsub;
 
Usercreated.
 
CDCPUB@test>grantcreatesessiontocdcsub;
 
Grantsucceeded.
 
CDCPUB@test>grantcreatetabletocdcsub;
 
Grantsucceeded.
 
CDCPUB@test>grantselectoncdcpub.sales_ct_dhotlogtocdcsub;
 
Grantsucceeded.

五.订阅变化数据

订阅的步骤和同步CDC模式基本一致,这里就不重复了,需要注意的是,在异步分布式HotLog和异步AutoLog中,订阅者和订阅过程都是在staging database中完成的。具体步骤请参考关于Change Data Capture(二)中关于订阅变化数据的部分。