zoukankan      html  css  js  c++  java
  • Streams Replication in a Nutshell

    Streams Repliation 简介

    Oracle Streams Replication提供了一种数据(广义上的,不仅仅是表中的数据)共享(同步)的机制,可以用来进行数据库级别(global), schema级别,table级别的数据复制。Streams主要借助于AQ, Scheduler(job), LogMiner 等技术来实现数据的传递和复制。

    Streams Replication主要通过所谓的captuer, propagation, apply三种background process来完成数据复制的工作。

    (1) Capture Process 运行在源数据库上,通过挖掘redo 日志文件(online & archived, 因此源数据库需要设置为archivelog mode), 生成一些列的LCR (logical change record), 然后将这些LCR放到Source Queue中。

    (2) Propagation Process是用来连接源数据库和目标数据库的 (不过也是在源数据库上配置的),将LCR从源数据的queue传递到目标数据库的queue. Propogation是通过job来完成的。

    (3) Apply Process运行在目标数据库上, 将源数据库的LCR(从queue中取出)应用到目标数据上,因此实现数据的同步。

    Streams的基本架构

    下面几张图片勾勒出了streams的几种基本架构,这些图片来自Julian Dyke

    Source Database & Target Database

    Source Database & Downstream Database & Target Database

    Real time downstream database capture

      

    配置Streams Replication的一些参数要求

    (1) 参数global_names需要设置成true (默认值一般为false), 

        数据库的global_name := db_name || '.' || db_domain.

    (2) 参数job_queue_processes > 2 (默认值一般为10)

         job_queue_processes这个参数用来设置最多有多少个process可以用来相应DBMS_JOBS(DBMS_SCHEDULER)创建的job请求。

    global_names 和 job_queue_processes 这两个参数跟propagation相关。

    (3) 参数compatible高于9.2.0, 目标数据库中改参数值不要低于源数据库

    (4) streams_pool_size, 这个参数我认为很重要,虽然没有直接证明,但是我猜测做了很多次实验都没有成功都是因为这个值过低的缘故。这个参数的值最好设置为200M以上。 我之前在虚拟机里面做了些实验(我在虚拟机里面装了两个数据库,而因为内存有限,因此streams pool的值都不大),所有的配置都没问题,但是replication就是不成功,让我非常崩溃,我找了好多人做的例子,一步步照着做就是不成功。后来我换了个环境,将这个参数设置为200M就成功了。法拉克!

    关于LCR(Logical Change Record)

    (1)有两种类型的LCR:

      - DML (row)  LCR (sys.LCR$_ROW_RECORD)

      - DDL LCR (sys.LCR$_DDL_RECORD)

    (2)存储LCR的队列的支持的类型是ANYDATA.

    关于Supplemental Logging

    关于supplemental logging, http://www.smenu.org/tutoria_streams_3_suplog.html 有比较详细的描述。

     

    首先应该明白什么是supplemental logging, 为什么需要supplemental logging.

    需要注意的是supplemental logging只会影响到update操作。我们知道,当对表中的数据进行更改(update), 这些更改会以change vector形式存入redo log file.  Change Vector包含了数据的改变(new value & old value) 和 改变对应行的地址(rowid), 这样才能定位到是哪些记录被更改了。因为rowid是局限于一个数据中的,在LCR传播(propagation)到目标数据库的时候,目标数据库显然不能用源数据的rowid来找到要进行数据更改的行。那么怎么样才能保证目标数据库和源数据库的更改发生在同样的数据行呢? 很容易想到的是,如果把主键的信息也包含在LCR中,应该可以准确定位到要进行更改的数据行。那么这个主键就是所谓的supplemental logging.  如果表上有主键的话,自然只要将主键的信息也写入日志文件,这样就可以保证目标数据库和源数据上改动的一致性。如果有些表没有主键怎么办呢?那么可以考虑用unique key, foreign key, 甚至把所有的column都加进来。但是很显然这样的后果自然是产生更多的redo log。

    有两种类型的supplemental logging: database supplemental logging 和 table supplemental logging. 如果是选择table级别的supplemental logging, 还需要在unconditional log group 和conditional log group 中间选择。unconditional log groups,顾名思义,就是指的是不管改动的column有没有包含在supplemental logging group中,这些supplemental logging group中的column的前镜像(before image)都会被log下来。而conditional log groups指的是只有改变的column是supplemental logging group中的column的时候,才会log下这些column的before image.

    在数据库级别,可以通过如下命令来添加最少的(minimal)的supplemental logging.

    ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;  (如果想删除的话,可以用ALTER DATABASE DROP SUPPLEMENTAL LOG DATA)

    可以通过查询v$database来检查minimal supplemental logging时候被enable了

    SELECT supplemental_log_data_min FROM v$database;

    Database级别的supplemental logging 可以在如下这些粒度上enable...

    - 所有列  (注意,不包括类型为LONG/LOB/LONG RAW/Collection的列)

    - 主键列

    - 唯一键列

    - 外键列

    可以通过如下的命令来分别实现上面的这些粒度控制,

    ALTER DATABASE ADD SUPPLEMENTAL LOG DATA(primary key) COLUMNS;

    ALTER DATABASE ADD SUPPLEMENTAL LOG DATA(unique) COLUMNS;

    ALTER DATABASE ADD SUPPLEMENTAL LOG DATA(foreign key) COLUMNS;

    ALTER DATABASE ADD SUPPLEMENTAL LOG DATA(all) COLUMNS;

    可以通过如下SQL语句查询上面的语句有没有生效...

    SELECT supplemental_log_data_min,

        supplemental_log_data_pk,

        supplemental_log_data_ui,

        supplemental_log_data_fk,

        supplemental_log_data_all

    FROM v$database;

    在database级别enable supplemental logging是通过LOG DATA来实现的,而对table级别设置supplemental logging, 除了可以通过LOG DATA, 也可以通过log group来实现的。LOG GROUP实际上是通过constraint来实现的。

    Note: In Oracle 10.2, minimal supplemental logging must be enabled at database level before supplemental logging can be enabled at table level

    Conditional supplemental logging可以通过如下方式来设置... 

    ALTER TABLE t1 ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;

    ALTER TABLE t1 ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;

    Unconditional supplemental logging 可以通过log group来实现, (ALWAYS标明是unconditional的)

    ALTER TABLE t1 ADD SUPPLEMENTAL LOG GROUP t1_g1 (c1,c3) ALWAYS;

    可以通过视图DBA_LOG_GROUPS 和 DBA_LOG_GROUP_COLUMNS来查看数据库当前的log group设置情况。

  • 相关阅读:
    .ashx
    svn设置过滤内容
    .NET开发人员应该下载的十个必备工具(1)
    C#中操作XML (节点添加,修改,删除完整版)
    NVelocity模板引擎的注意事项
    什么是好的程序员?
    SQLSERVER2005登录时出错
    240多个jQuery插件(转)
    自己搭建svn
    一元三次方程求解
  • 原文地址:https://www.cnblogs.com/fangwenyu/p/1970260.html
Copyright © 2011-2022 走看看