oracle stream 主要是针对数据库而言的,而不是针对实例,所以rac的多表复制(本地捕获)其实跟单实例的多表复制(本地捕获)是一样的,唯一要注意的是rac产生的归档必须在共享磁盘上的同一目录中,同时创建的directory也最好是在共享磁盘上的目录。否则在执行过程中会报错,导致过程不能执行。一、前提条件:源数据库(集群数据库rac):
rac节点1:操作系统:redhat ES5.4oracle版本:10.2.0.4(64位)实例名:rac1数据库名:racpublic ip地址:192.168.1.100vip:192.168.1.50priv ip地址:10.0.0.1global_name:rac
rac节点2:操作系统:redhat ES5.4oracle版本:10.2.0.4(64位)实例名:rac2数据库名:racpublic ip地址:192.168.1.101vip:192.168.1.51priv ip地址:10.0.0.2global_name:rac
数据库存放在磁盘阵列上,并使用了oracle的分布式文件系统ocfs.
目标数据库(单实例数据库):操作系统:redhat ES5.4oracle版本:10.2.0.4(64位)数据库名:racbakip地址:192.168.1.200global_name:racbak
同步集群数据库rac中ydmm用户下的user、product、price表,同时racbak数据库中必须要有ydmm用户,最好保持密码相同,单向同步,即源同步到目标。源数据库与目标数据库的字符集一定要相同,否则会在导入数据同步的时候报错!
二、设置源和目标数据库初始化参数及归档模式在这里rac的参数设置及归档模式不同于单实例的相关设置,在此进行详细说明:在RAC库设为归档模式修改spfile文件(因为rac的spfile文件为两个节点所共用(我的环境是放在了共享文件系统上了),因此在一个节点上完成便可,以下以rac1为列)sqlplus "/as sysdba"SQL>create pfile='/home/oracle/pfilerac.ora' from spfile;SQL>shutdown immediate修改/home/oracle/pfilerac.ora文件,增加如下参数*.log_archive_dest_1='LOCATION=/home/oracle/archivelog'(该目录需人工创建,并且连接到磁盘阵列上的一个分区,也就是说该目录mount到了分布式文件系统上了,rac2也必须有相同的目录并mount到对应的分区上,即rac1和rac2mount的分区相同,当然也可以用ln -s在磁盘上同一目录进行软连接,总之,最后的目的是两个实例产生的日志在磁盘阵列上的同一目录里,两个实例都能互相看到彼此产生的归档日志)*.log_archive_format='%t_%s_%r.dbf'将*.cluster_database=true改为*.cluster_database=false关闭rac1和rac2数据库root#/etc/init.d/init.crs stop在rac1上进行如下操作root#su - oracle$sqlplus "/as sysdba"SQL>shutdown immediate在rac1上起用新的初始化参数SQL>startup mount pfile='/home/oracle/pfilerac.ora'SQL>archive log listSQL>alter database archivelog完成后将数据库关闭并修改/home/oracle/pfilerac.ora中的*.cluster_database=true创建新的spfilesqlplus "/as sysdba"SQL>startup mount pfile='/home/oracle/pfilerac.ora'SQL>create spfile from pfile='/home/oracle/pfilerac.ora'SQL>shutdown immediate因在rac1上操作,因此会生成$ORACLE_HOME/dbs/spfilerac1.ora,将该文件移动到磁盘阵列共享文件系统上相应目录中替换成spfilerac.ora便可,然后两个节点都启动数据库root#/etc/init.d/init.crs start
rac上参数修改,方法跟上面修改为归档的办法类似,只是不需要将*.cluster_database=true改为*.cluster_database=false,所要增加的参数,跟以前的一样,在此列一下就可以了:修改生成的pfile.ora内容如下*.aq_tm_processes=2 #启用对队列消息的时间监视*.job_queue_processes=10 #指定例程的 SNP 作业队列进程的数量以上两个参数为修改的参数下面的参数为增加的参数*.global_names='true' #建db_link的设置*.undo_retention=3600 #控制事务被commit后,undo信息保留的时间*.nls_date_format='YYYY-MM-DD HH24:MI:SS'*.streams_pool_size=209715200 #控制streams缓存空间的大小*.utl_file_dir='*' #设定Oracle只能读写utl_file_dir 指定目录*.open_links=10 #调用db_link链路数设置
目标数据库初始化参数及归档模式设置:在此不再多说,请参考前面一章中的相关内容
三、创建stream用户相关环境略,请参考前面一章中的相关内容
四、配置tnsnames.Ora在源数据库rac1和rac2实例的tnsnames.Ora都增加如下连接信息racbak = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.200)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = racbak) ) )
在目标数据库的tnsnames.Ora都加如下连接信息RAC = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.101)(PORT = 1521)) (LOAD_BALANCE = yes) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = rac) ) )RAC2 = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.101)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = rac) (INSTANCE_NAME = rac2) ) )
RAC1 = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = rac) (INSTANCE_NAME = rac1) ) )
五、创建DB_Link略,请参考前面一章中的相关内容,rac上只在一个节点创建一次就可以了(数据库就一个),注:db_link的名字跟对应的数据库名一样
六、在源库和目标库创建directory略,请参考前面一章中的相关内容,rac上只在一个节点创建一次就可以了(数据库就一个),注:rac生成的directory最好在阵列上,跟归档目录/home/oracle/archivelog情况一样
七、执行DBMS_STREAMS_ADM.MAINTAIN_TABLES 过程SQL>conn strmadmin/strmadmin SQL>DECLARE tbls DBMS_UTILITY.UNCL_ARRAY; BEGIN tbls(1) := 'ydmm.user'; tbls(2) := 'ydmm.product'; tbls(3) := 'ydmm.price'; DBMS_STREAMS_ADM.MAINTAIN_TABLES( table_names => tbls, source_directory_object => 'racdump', destination_directory_object => 'racbakdump', source_database => 'rac', destination_database => 'racbak', perform_actions => true, bi_directional => false, include_ddl => true, instantiation => DBMS_STREAMS_ADM.INSTANTIATION_TABLE_NETWORK); END; /
注意:在此instantiation参数我们使用了DBMS_STREAMS_ADM.INSTANTIATION_TABLE_NETWORK值,这样就不产生dmp文件而直接将数据传入了目标数据库,所以将dump_file_name、log_file两个参数也取消了。
八、测试验证可以分别在rac1和rac2上进行操作,看是否同步到目标数据库,具体操作,请参考前面一章中的相关内容。
