日期:2014-05-16 浏览次数:20488 次
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复制几个从库,从库可用于查询、报表等。
环境: 11.2.0.3 + OEL5.7
源端: 主机名:zlm 192.168.1.55 SID:zlm11gGLOBAL NAME:zlm11g
目标端:主机名:stream192.168.1.65 SID:strmtargetGLOBAL NAME:strmtarget
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;
/
--源端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