Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1239496
  • 博文数量: 350
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 5668
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-23 17:53
文章分类

全部博文(350)

文章存档

2013年(350)

分类: Oracle

2013-04-27 09:40:47

第三部分将主要通过一些更灵活的方式配置单源或多源的复制环境,前面部分已经花了很多篇幅介绍通过DBMS_STREAMS_ADM过程,实现不同级别的Streams复制环境,整个过程比较简单,除了准备工作外,对复制环境的配置几乎都是一个过程即可完成。这种方式有利也有弊,优势在于配置简单,只需要一些简单操作就可以轻易建设一个streams的复制环境,劣势也是因为太过简单,定制性不强(或者说不够强)。本部分则希望通过一此演示,能让你具有定制streams环境的能力。

  这里单源复制环境不是是说数据都从一处来,而是指单个对象的仅来源于一处,但可能有多个同时捕获数据。在启动capture 进程和配置传播前,确认已经配置了propagation和apply进程处理相关LCRs。

一、 需求描述

  设定条件如下:

  • 源数据库 sid : jssweb ,目标库 : jssstr
  • 复制单表member.usr_user
  • 源库本地捕获 ,单向同步。
  • 同步 DML/ DDL 操作

二、 准备工作

  在本节演示进行之前,必须首先满足下列条件(下列操作除非特别指定,否则源端和目标端都需要执行,某些操作请注意转换路径,这里不再一一列举):

初始化参数设置:

  • GLOBAL_NAMES :是否启用全局名称,必须设置为true;
  • JOB_QUEUE_PROCESS :最大可启用的任务队列进程数,运行propagation进程的数据库中,该值不能低于2;
  • COMPATIBLE :兼容版本,不能低于10.2.0.1;
  • STREAMS_POOL_SIZE :流缓冲池,建议不低于200M。

数据库置为归档模式

  通常建议Streams复制环境中的数据库均启用归档,不过如果你的复制为单向,则目标端也可以不启用归档。如何启用前文已有描述,不多说了。

配置TNSNAMES

  两种方式,手工修改$ORACLE_HOME\network\admin\tnsnames.ora文件,或者通过netca界面化方式配置,都比较简单,这里不再演示了。

创建员帐户

a>. 首先创建新的表空间(不建议streams管理员默认表空间与其它业务用表空间混用,尤其不建议使用system表空间)

JSSWEB> create tablespace strmtbs datafile ¨ /data/oradata/jssweb/ strmtbs01.ora¨ size 200m;

Tablespace created.

b>. 创建streams管理员帐号并授予权限,这里创建strmadmin做为streams管理员并授予dba权限

JSSWEB> create user strmadmin identified by strmadmin default tablespace strmtbs quota unlimited on strmtbs;

User created.

JSSWEB> grant dba to strmadmin;

User created.

三、 创建ANYDATA队列和数据库链

首先在源端操作:

SQL> conn strmadmin/strmadmin

Connected.

JSSWEB> set sqlprompt "JSSWEB> "

JSSWEB> exec dbms_streams_adm.set_up_queue();

PL/SQL procedure successfully completed.

JSSWEB> create database link jssstr connect to strmadmin identified by strmadmin using ¨jssstr_172.25.13.231¨;

Database link created.

JSSWEB> select sysdate from dual@jssstr;

SYSDATE

--------------

24-3 月 -09

转到目标端做相同操作(由于是单向复制,dblink可以不创建):

SQL> conn strmadmin/strmadmin

Connected.

JSSSTR> set sqlprompt "JSSSTR> "

JSSSTR> exec dbms_streams_adm.set_up_queue();

PL/SQL procedure successfully completed.

  提示:dbms_streams_adm.set_up_queue()是做什么的?

  该过程语法如下:

  DBMS_STREAMS_ADM.SET_UP_QUEUE(

   queue_table IN VARCHAR2 DEFAULT ¨streams_queue_table¨,

   storage_clause IN VARCHAR2 DEFAULT NULL,

   queue_name IN VARCHAR2 DEFAULT ¨streams_queue¨,

   queue_user IN VARCHAR2 DEFAULT NULL,

   comment IN VARCHAR2 DEFAULT NULL);

  执行该过程后会执行下列操作:

  • 创建一个名称为streams_queue_table(默认情况下)的队列表;
  • 创建一个名称为streams_queue(默认情况下)的队列并启动该队列;

  注意如果你自己指定streams_queue_table和streams_queue名称的话,长度不要超过24个字节。

四、 创建capture、propagation、apply进程

注意下列操作除非特别说明,否则所有操作均是在strmadmin下进行。

1、 源端配置Propagation进程

JSSWEB> BEGIN

2 DBMS_STREAMS_ADM.ADD_TABLE_PROPAGATION_RULES(

3 table_name => ¨member.usr_user¨,

4 streams_name => ¨web_to_str¨,

5 source_queue_name => ¨strmadmin.streams_queue¨,

6 destination_queue_name => ¨strmadmin.streams_queue@jssstr.jss.cn¨,

7 include_dml => true,

8 include_ddl => true,

9 source_database => ¨jssweb.jss.cn¨,

10 inclusion_rule => true,

11 queue_to_queue => true);

12 END;

13 /

PL/SQL procedure successfully completed.

2、 源端配置Capture进程

JSSWEB> BEGIN

2 DBMS_STREAMS_ADM.ADD_TABLE_RULES(

3 table_name => ¨member.usr_user¨,

4 streams_type => ¨capture¨,

5 streams_name => ¨jssweb_capture_tbl¨,

6 queue_name => ¨strmadmin.streams_queue¨,

7 include_dml => true,

8 include_ddl => true,

9 inclusion_rule => true);

10 END;

11 /

PL/SQL procedure successfully completed.

3、 目标端设置member.usr_user表的实例scn

本例中设定源端和目标端都已经存在member.usr_user表,并且两表内容一致。由于表已存在,因此你需要手动设置实例scn。

JSSSTR> DECLARE

2 iscn NUMBER; -- Variable to hold instantiation SCN value

3 BEGIN

4 iscn := DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER();

5 DBMS_APPLY_ADM.SET_TABLE_INSTANTIATION_SCN@jssstr.jss.cn(

6 source_object_name => ¨member.usr_user¨,

7 source_database_name => ¨jssweb.jss.cn¨,

8 instantiation_scn => iscn);

9 END;

10 /

PL/SQL procedure successfully completed.

本步很重要,一旦操作不对极有可能造成源和目标端不一致,并导致同步失败。建议从执行此操作开始,到源端启用capture进程前,源端都不要对member.usr_user表做任何修改。

如果目标端尚不存在要同步的表,则你可以通过exp/imp导入该表,imp导入时会自动实例scn。

4、 目标端配置Apply进程

JSSSTR> BEGIN

2 DBMS_STREAMS_ADM.ADD_TABLE_RULES(

3 table_name => ¨member.usr_user¨,

4 streams_type => ¨apply¨,

5 streams_name => ¨jssstr_apply_tbl¨,

6 queue_name => ¨strmadmin.streams_queue¨,

7 include_dml => true,

8 include_ddl => true,

9 source_database => ¨jssweb.jss.cn¨,

10 inclusion_rule => true);

11 END;

12 /

PL/SQL procedure successfully completed.

5、 目标端启动Apply进程

JSSSTR> exec dbms_apply_adm.start_apply(¨jssstr_apply_tbl¨);

PL/SQL procedure successfully completed.

6、 源端启动Capture进程

JSSWEB> exec dbms_capture_adm.start_capture(¨jssweb_capture_tbl¨);

PL/SQL procedure successfully completed.

五、

DML 操作测试:

JSSWEB> insert into member.usr_user values (100,¨Group user1¨);

1 row created.

JSSWEB> alter system switch logfile;

System altered.

JSSWEB> select count(0) from member.usr_user@jssstr;

COUNT(0)

----------

10

成功。

DDL 操作测试:

JSSWEB> truncate table member.usr_user;

Table truncated.

JSSWEB> alter system switch logfile;

System altered.

JSS > select count(0) from member.usr_user @jssstr ;

COUNT(0)

----------

0

竣工。

======================================

阅读(1159) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~