Oracle10gR2 Streams(一)概念与原理
NinGoo's blog

Oracle10gR2 Streams(一)概念与原理

打算写一个系列介绍下Oracle10gR2的streams,这里是第一篇,主要简单介绍下概念和原理。虽然streams号称可以支持异构数据库间的复制,但这个系列只涉及oracle数据库之间的复制问题,除非特别提及,这里的streams都是指10gR2版本的streams。

Oracle从9i开始推出streams,用于提供灵活的复制和容灾解决方案。但是9i的streams配置相当的麻烦,少说也有十几个步骤,还容易出错。10gR2则将整个配置过程封装在几个简单的PL/SQL过程中,使得配置过程大大的简化。但是实际的配置步骤还是一样的,Oracle只是利用这些PL/SQL过程先生成对应的脚本,然后再执行脚本进行配置。这个过程可以全自动完成,也可以先将脚本生成到某个指定的目录,我们根据需要修改脚本,然后再执行脚本进行配置,这样就灵活又方便。

Streams的原理其实很简单,通过logmnr技术从oracle的log中解析出数据,然后传递到目标库并应用,从而将源库的数据复制到目标库。当然,复制可以是双向的,也可以是单向的。双向复制还需要考虑数据冲突的问题。而多源复制其实是双向复制的基础上衍生而来的。

整个的复制过程可以分成三个步骤:捕获(capture),传播(propagation)和应用(apply),利用高级队列(advance queue)来将这三个步骤的数据串起来,通过在步骤中定义不同的规则(rule)来控制需要复制的数据。复制可以基于全库,基于表空间,基于用户或者基于表,提供了相当大的灵活性。

捕获进程可以直接在源库捕获日志,也可以先将日志(归档日志或者联机日志)传递另外的库中进行捕获,这就是本地捕获(local capture)和异地捕获(downstream capture)。对于异地捕获,根据是传递归档日志还是联机日志,可以分为普通的异地捕获和实时异地捕获。日志的传递其实和DataGuard中是一样的机制。Oracle11g的streams还提供了同步捕获,这里暂时不涉及了。

描述一下复制的简单过程如下:

首先捕获进程从日志解析出数据,封装在一个个的逻辑改变记录(LCR:logical change record)中,将这些lcr压进捕获队列中,然后传播进程从捕获队列取得数据压进应用队列中,最后应用进程从应用队列取得LCR并应用到目标库中。LCR可以分为row LCR(DML操作记录)和DDL LCR(DDL操作记录),所以streams复制可以支持DDL操作的复制。

Streams复制需要先进行一次初始化建立基线,然后在此基础上复制增量数据。对于全库的初始化,可以使用RMAN。表空间复制的初始化可以使用transport tablespace,而对于用户复制和表复制,则可以使用exp/imp或者expdb/impdp。

Streams配置和管理相关package

dbms_steams_adm
dbms_capture_adm
dbms_propagation_adm
dbms_apply_adm
dbms_rule_adm

Streams主要相关数据字典

dba_streams_administrator

dba_capture
dba_capture_parameters

dba_propagation
dba_registered_archived_log

dba_apply
dba_apply_confict_columns
dba_apply_dml_handlers
dba_apply_enqueue
dba_apply_error
dba_apply_execute
dba_apply_parameters
dba_apply_progress

dba_rules
dba_rule_sets
dba_rule_set_rules

V$STREAMS_CAPTURE
V$STREAMS_POOL_ADVICE
V$STREAMS_TRANSACTION

V$PROPAGATION_RECEIVER
V$PROPAGATION_SENDER

V$STREAMS_APPLY_COORDINATOR
V$STREAMS_APPLY_READER
V$STREAMS_APPLY_SERVER

更多streams数据字典,请参考这里

Streams涉及到很多的概念,本文只是提到了其中很少一部分,要想深入的了解streams机制和实现,请参考Oracle的两本官方文档:
Streams Concepts and Administration
Streams Replication Administrator’s Guide

本文网址:http://www.ningoo.net/html/2007/oracle10gr2_streams_concept_and_theory.html

订阅到Google | 收藏到Del.icio.us | 推荐到鲜果

上一篇: 下一篇:
相关文章 随机文章

本文Tags: ,

4 条评论

  • At 2007.11.03 15:20, Oracle10gR2 streams(三)全库复制之一 said:

    [...] 前面有提到,pre_instantiation_setup/post_instantiation_setup过程实际上是先生成一个配置脚本,然后再执行脚本进行配置。这个两个步骤可以是一次完成,也可以分开完成,具体就是通过设置perform_actions参数来实现。假如我们只生成配置脚本: STRMADM@ning>create directory dir_script as ‘f:oracle’;Directory created.STRMADM@ning>DECLARE  2    empty_tbs  DBMS_STREAMS_TABLESPACE_ADM.TABLESPACE_SET;  3  BEGIN  4    DBMS_STREAMS_ADM.PRE_INSTANTIATION_SETUP(  5      maintain_mode        => ‘GLOBAL’,  6      tablespace_names     => empty_tbs,  7      source_database      => ‘ning.test’,  8      destination_database => ‘dest.test’,  9      perform_actions      => false, 10      script_directory_object =>’DIR_SCRIPT’, 11      script_name          => ‘pre_script.sql’, 12      bi_directional       => true, 13      include_ddl          => true, 14      start_processes      => true, 15      exclude_schemas      => NULL, 16      exclude_flags        => DBMS_STREAMS_ADM.EXCLUDE_FLAGS_UNSUPPORTED + 17                              DBMS_STREAMS_ADM.EXCLUDE_FLAGS_DML + 18                              DBMS_STREAMS_ADM.EXCLUDE_FLAGS_DDL); 19  END; 20  /PL/SQL procedure successfully completed. [...]

    • At 2008.03.03 11:08, soberass said:

      流复制是否支持同步复制,从流的原理上看似乎谈不上同步了,都是异步的,不是对不对?

      • At 2008.03.03 12:27, NinGoo said:

        oracle11g可以做到同步捕获,但复制肯定是要异步的,毕竟是通过队列来进行的。

      • At 2010.05.25 16:53, 忧郁猫 said:

        downstream复制table的时候,源schema和目标schema的名称可以不同么?table名可以改变么?


        (Required)
        (Required, will not be published)