DBMS_STREAMS_ADM 中提供了三种创建表空间级复制环境的过程:

  • MAINTAIN_SIMPLE_TTS :单个表空间的复制
  • MAINTAIN_TTS :多个表空间的复制
  • PRE_INSTANTIATION_SETUP 和POST_INSTANTIATION_SETUP:多个表空间的复制

  MAINTAIN_SIMPLE_TTS 和MAINTAIN_TTS两过程都会自动添加否定规则集过滤streams不支持的数据库对象,PRE_INSTAINTIATION_SETUP和POST_INSTAINTIATION_SETUP则需要你手工配置参数(前章介绍过),对于数据库中不支持的对象可以通过查询DBA_STREAMS_UNSUPPORTED获得,如果不被支持的对象未被过滤,则捕获时会抛出异常。

  PRE_INSTANTIATION_SETUP 和POST_INSTANTIATION_SETUP前章刚刚演示过了创建整库的复制环境,用于表空间级的创建也大同小异,因此本章三思决定尝试通过MAINTAIN_TTS来创建一个表空间级的复制环境(MAINTAIN_TTS也可以用来复制单个表空间,MAINTAIN_SIMPLE_TTS的实现方式与MAINTAIN_TTS类似,但功能却有不及,因此这里也不演示了)。

  表空间级的复制有一点需要注意,即要复制的表空间是否是自包含(self-contained),关于自包含的概念三思在" 使用传输表空间的特性复制数据 " 系列文章中有过详尽描述,如果希望深入了解的朋友不妨先去阅读,这里也简单提一下,所谓自包含表空间就是指表空间中对象其引用或被引用对象是否与其在同一表空间,比如说表的索引所在表空间与表所在表空间不同,则该表空间就不算自包含表空间,除非你决定同时复制这两个表空间。

  本章示例沿用前章中的环境(哈哈,正好前章最后一步已经把streams清除了),因此起码准备工作那步可以省掉了,设定环境如下:

  • 源数据库 sid : jssweb ,目标库 : jssstr
  • 下游捕获
  • 复制webdata表空间,配置为 双向复制
  • 同步DDL操作
  • DBMS_STREAMS_ADM.MAINTAIN_TTS 直接 生成 配置
  • STREAMS 管理已经创建,源和目标端通讯用的数据库链也已经创建

一、 准备工作:

除上一章中进行过的准备工作外(创建辅助实例就不需要了,表空间级的复制目标库肯定已经存在),还需要进行如下操作。

1、 构造要复制的表空间并初始化一些数据

    JSSWEB> conn / as sysdba

    Connected.

    JSSWEB> create tablespace webdata datafile ¨/data/oradata/jssweb/webdata01.dbf¨ size 100m;

    Tablespace created.

    JSSWEB> create user member identified by member default tablespace webdata quota unlimited on webdata;

    User created.

    JSSWEB> grant connect,resource to member;

    Grant succeeded.

    JSSWEB> revoke unlimited tablespace from member;

    Revoke succeeded.

    JSSWEB> create table member.dt_tbl1 as select object_id id,object_name name            

      2  from all_objects where rownum<=100;

    Table created.

    JSSWEB> commit;

    Commit complete.

  注意哟,要复制的表空间中对象所属schema在目标端也必须存在,因此这里,目标端也需要创建member这个用户。

    JSSSTR> create user member identified by member default tablespace users;

    用户已创建。

    JSSSTR> grant connect,resource to member;

    授权成功。

2、 在源端和目标端分别创建directory对象:

  首先在源端创建数据泵文件中转目录:

    JSSWEB> conn strmadmin/strmadmin

    Connected.

    JSSWEB> create directory mydt _source  as ¨/data/oradata/jssweb/ dmp ¨;

    Directory created.

  另外,源端还需要创建一个directory对象,指向到要复制的表空间对应数据文件所在路径:

    JSSWEB> create directory dfpath as ¨/data/oradata/jssweb¨;

    Directory created.

  提示:如果表空间对应的数据文件在多个不同路径下,那就得创建多个directory,这个非常重要,maintain_tts在执行时需要读取这部分信息复制数据文件。

  目标端创建创建数据文件目录:

    JSSSTR> conn strmadmin/strmadmin

    已连接。

    JSSSTR> create directory mydt _dest  as ¨/data/oradata/jssstr¨;

    目录已创建。

  注意,要确认/data/oradata/jssweb/dmp和/data/oradata/jssstr目录在各自操作系统中确实存在,不然后面执行expdp/impdp时会报错。

3、 设置归档路径

  因为这里三思准备采用下游捕获的方式,因此需要在源端配置log_archive_dest_n参数,以发送源端归档到捕获数据库(当然我们这里捕获数据库其实也就是目标数据库)。

    JSSWEB> alter system set log_archive_dest_2=¨service=jssstr.jss.cn lgwr async noregister¨;

    System altered.

4、 检查是否自包含表空间

  虽然表空间是我们刚刚创建的,三思确信肯定是个自包含的表空间,不过呢,还是把检查的步骤贴出来供参考,也许实际应用中你就会用到:

    JSSWEB> set serveroutput on

    JSSWEB> exec sys.dbms_tts.transport_set_check(¨WEBDATA¨,true,true);

    PL/SQL procedure successfully completed.

    JSSWEB> select * from sys.transport_set_violations; 

    no rows selected

  返回为空,说明没有问题。