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

全部博文(350)

文章存档

2013年(350)

分类: Oracle

2013-04-25 13:17:09

 Schema 级的复制可以通过DBMS_STREAMS_ADM.MAINTAIN_SCHEMAS创建,经过前面表空间级的试练,接着创建schema级的复制环境还是比较简单的。

  本章示例继续沿用前章中的环境(主要是环境,之前的复制环境已被清除),并设定环境如下:

  • 数据库 sid : jssweb ,目标库 : jssstr ;
  • 复制schema:member,同步DML,DDL操作;
  • 本地捕获,双向同步(又变了哟,又改为本地捕获了);
  • DBMS_STREAMS_ADM.MAINTAIN_TTS 直接 生成 配置 ;
  • STREAMS 管理员已经创建,源和目标端通讯用的数据库链也已经创建。

  由于前面刚刚使用MAINTAIN_TTS做完表空间级的同步,因此这里准备工作可以都省掉了,如果你没有按照三思本文的介绍的顺序执行,务必先参考前章表空间级同步时的准备工作。

  如果是完全按照三思介绍的步骤进行的测试,千万别忘了在执行本步之前,先清除之前的复制环境,并删除目标端member下所有对象。

1、 执行创建

  除了清除之前的复制环境,删除原目标端schema中对象外,就没啥别的要做了,直接执行创建即可,创建非常简单,基本就是一个过程的事情。

  首先在源端以strmadmin登陆:

    JSSWEB> conn strmadmin/strmadmin

    Connected.

    JSSWEB> BEGIN

    2 DBMS_STREAMS_ADM.MAINTAIN_SCHEMAS(

    3 schema_names => ¨member¨,

    4 source_directory_object => ¨mydt_source¨,

    5 destination_directory_object => ¨mydt_dest¨,

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

    7 destination_database => ¨jssstr.jss.cn¨,

    8 perform_actions => true,

    9 dump_file_name => ¨export_member.dmp¨,

    10 log_file => ¨export_member_expdp.log¨,

    11 bi_directional => true,

    12 include_ddl => true,

    13 instantiation => DBMS_STREAMS_ADM.INSTANTIATION_SCHEMA);

    14 END;

    15 /

    PL/SQL procedure successfully completed.

  本过程又带来一个新的参数:instantiation ,该参数用来指定是否执行实例化,有如下几种值:

  • DBMS_STREAMS_ADM.INSTANTIATION_SCHEMA :通过expdp/impdp初始化数据,并在目标端导入数据时执行实例化,默认情况下即是该值。
  • DBMS_STREAMS_ADM.INSTANTIATION_SCHEMA_NETWORK :impdp直接通过网络传输数据而不生成dmp文件。在导入数据时执行实例化。
  • DBMS_STREAMS_ADM.INSTANTIATION_NONE :不执行实例化,该属性值仅当perform_actions参数设置为false时有效。

    注意:

    由于我们此处选择配置双向复制,因此在执行该过程时,目标端不要对member中对象做任何DML/DDL操作,以免存在数据丢失。

    MAINTAIN_SCHEMAS 过程支持同时多个schema,比如有多个schema需要复制,则在begin之前声明一个DBMS_UTILITY.UNCL_ARRAY数组变量即可,例如:

    DECLARE

    tab_schema dbms_utility.uncl_array;

    Begin

    tab_schema(1):=¨scott¨;

    tab_schema(2):=¨member¨;

    ................

    DBMS_STREAMS_ADM.MAINTAIN_SCHEMAS(

    schema_names => tab_schema,

    .............

    .............

2、 测试一下

  源端执行:

    JSSWEB> desc member.dt_tbl1;

    Name Null? Type

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

    ID NOT NULL NUMBER

    NAME NOT NULL VARCHAR2(30)

    VL VARCHAR2(20)

    JSSWEB> select count(0) from member.dt_tbl1;

    COUNT(0)

    ----------

    10 2

    JSSWEB> insert into member.dt_tbl1 values (103,¨c¨,null);

    1 row created.

    JSSWEB> alter table member.dt_tbl1 drop column vl;

    Table altered.

    JSSWEB> alter system switch logfile;

    System altered.

  切换到目标端查看:

    JSSSTR> select count(0) from member.dt_tbl1;

    COUNT(0)

    ----------

    103

    JSSSTR> desc member.dt_tbl1;

    名称 是否为空? 类型

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

    ID NOT NULL NUMBER

    NAME NOT NULL VARCHAR2(30)

  成功捕获、传播、并在目标端应用。

  由于我们此处配置为双向复制,双方向都是源,因此有必要在目标端也执行一些DDL,DML,看是否能够正确复制。

  这里测试在目标端创建一张表,看看是否能够传播到源端:

    JSSSTR> create table member.dt_tbl2 (id number);

    表已创建。

    JSSSTR> alter system switch logfile;

    系统已更改。

    切换到另台机器:

    JSSWEB> select table_name from dba_tables where wner=¨MEMBER¨;

    TABLE_NAME

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

    DT_TBL1

    DT_TMP

    DT_TBL2

  成功复制,双向的schema复制环境搭建成功。

3、 清除复制环境

  源和目标端分别执行DBMS_STREAMS_ADM.REMOVE。

    JSSWEB> exec dbms_streams_adm.remove_streams_configuration;

    PL/SQL procedure successfully completed.

    JSSSTR> exec dbms_streams_adm.remove_streams_configuration;

    PL/SQL 过程已成功完成。

  然后视需要,删除相关对象/schema/tablespace即可。

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

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