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

2011030720282558.png

Source Database & Downstream Database & Target Database

2011030720285596.png

Real time downstream database capture

2011030720291454.png

  

配置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设置情况。

转载于:https://www.cnblogs.com/fangwenyu/archive/2011/03/07/1970260.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值