这里单源复制环境不是是说数据都从一处来,而是指单个对象的仅来源于一处,但可能有多个数据库同时捕获数据。在启动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 WEB > select count(0) from member.usr_user @jssstr ;

  COUNT(0)

----------

         0

竣工。