日期:2014-05-16  浏览次数:20470 次

Stream技术总结及11gR2 Stream Replication同步复制实验(SCHEMA&TABLE)

一、Stream技术特点及与OGG产品的主要区别


Stream和OGG都可作为高可用环境中用于复制并同步数据的解决方案。Stream是自9i以来,Oralce数据库提供的一种功能,主要是Oracle的消息队列(也叫Oracle Advanced Queue)技术的一种扩展应用,流复制(Stream replication)只是基于它的一个数据共享技术。不同的是,OGG作为原来的第三方软件,自从被oracle收购并加以改进以后,其功能上较Stream而言则更加完善,配置也更方便。它们都可以用于Oralce与Oralce或Oracle与非Oracle数据库之间的同步,但在复制机制上,还是存在不少区别的,主要有以下几点:

 

1.Stream由于是基于消息队列的,所以在同步复制数据库前,源和目标端必须都要配置一个队列Queue,再配置相关的capture,propagation,apply进程,并且还需要配置DB LINK,而OGG只需要配置extract,pump,replicat就可以满足复制条件。

 

2.Stream采用的是内部进程,即采用Oralce数据库提供的包和存储过程来配置进程,而OGG是需要另外安装软件,由软件来提供的参数命令来配置相关工作进程。

 

3.Stream采用的复制机制是类似与在DG中LOGICALSTANDBY的方式,即利用LOGMINER,对复制到目标端的log日志数据文件进行挖掘分析,然后重新执行SQL语句来达到同步数据的目的,使用的是自己特有的一种格式——LCR。Stream需要把日志文件全部通过队列复制到目标端,而不管是否是提交的数据,最后再过滤掉未提交的数据,应用提交数据,由于捕获的日志非常多(可能是大量无效数据,实时同步时,如果全部取消提交的话),对源端数据库会造成一定的影响,且有较高的网络依赖性,效率不高。而ogg则是采用自己的方式,通过抽取源端日志中已提交的事务,传送到目标端后直接应用,由于抽取的数据量较之Stream要少很多,所以效率要高,据官方称,理论上可以达到亚秒级别。

 

4.Stream由于是把Commited和Uncommited的数据都复制到源端,应用的时候只能采用SCN的顺序,而OGG因为复制的都是Commited的数据,在目标端也是以Commit的顺序应用的。这是它们之间在数据应用时的一大区别。

 

5.Stream作为数据库组件之一,其工作时需要用到数据库SGA分配的内存,还要建立StreamPool,占用了一定的数据库资源,而OGG由于是第三方软件,用的是OS分配的内存,对数据库的影响很有限。

 

6.最后一点区别和机制无关,但是也得提一下,鉴于ogg动辄百万的昂贵的价格,如果只是执行复制Schema或Table等简单操作,Stream完全可以胜任,在能够以不花钱又能完成相同的任务的前提下,首选的当然是简单又好用的Stream了。由于这两种软件在所实现的功能上差异性并不大,考虑到商业因素,将来Oralce一定是大力发展OGG,据我所知,目前Oralce已经停止对Stream的更新了。

 

Stream用于Oralce数据库之间的数据复制,包括database,schema,table,数据仓库加载等,它也能支持异构平台(需要oracle gateway支持),参与复制的每个数据库可以读写,提供数据保护,但是Stream在容灾方面相对于OGG而言要弱一点,适合用于作为数据共享的应用方式,可以利用Stream复制几个从库,从库可用于查询、报表等。


二、STREAM REPLICATION实验


环境:    11.2.0.3 + OEL5.7

源端:    主机名:zlm 192.168.1.55 SID:zlm11gGLOBAL NAME:zlm11g

目标端:主机名:stream192.168.1.65 SID:strmtargetGLOBAL NAME:strmtarget

 

1.StreamsReplication准备阶段

1.1 在源端和目标端配置STREAM管理员用户

SQL> create tablespace streams_tbsdatafile '/u01/app/oracle/oradata/zlm11g/streams_tbs.dbf'size 25mreuse autoextend on maxsize unlimited;

SQL> create user strmadmin identified bystrmadmin default tablespace streams_tbsquotaunlimited on streams_tbs;

SQL> grant dba to strmadmin;

SQL> begin

  dbms_streams_auth.grant_admin_privilege(

   grantee          =>'strmadmin',   

   grant_privileges => TRUE);

end;

/


1.2 配置源端和目标端的listener.ora和tnsnames.ora(用netca自动生成)

--源端listener.ora

LISTENER =

 (DESCRIPTION_LIST =

   (DESCRIPTION =

     (ADDRESS = (PROTOCOL = TCP)(HOST = zlm)(PORT = 1521))

     (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))

    )

  )

 

ADR_BASE_LISTENER= /u01/app/oracle

 

--目标端listener.ora

LISTENER =

 (DESCRIPTION_LIST =

   (DESCRIPTION =

     (ADDRESS = (PROTOCOL = TCP)(HOST = stream)(PORT = 1521))

     (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))

    )

  )

 

ADR_BASE_LISTENER= /u01/app/oracle

 

--源端和目标端的tnsnames.ora内容一致,如下

STRMTARGET =

 (DESCRIPTION =

   (ADDRESS_LIST =

     (ADDRESS = (PROTOCOL = TCP)(HOST = stream)(PORT = 1521))

    )

   (CONNECT_DATA =

 &nbs