oracle10g rac stream 多表复制(本地捕获)

oracle stream 主要是针对数据库而言的,而不是针对实例,所以rac的多表复制(本地捕获)其实跟单实例的多表复制(本地捕获)是一样的,唯一要注意的是rac产生的归档必须在共享磁盘上的同一目录中,同时创建的directory也最好是在共享磁盘上的目录。否则在执行过程中会报错,导致过程不能执行。

一、前提条件:
源数据库(集群数据库rac):

rac节点1:
操作系统:redhat ES5.4
oracle版本:10.2.0.4(64位)
实例名:rac1
数据库名:rac
public ip地址:192.168.1.100
vip:192.168.1.50
priv ip地址:10.0.0.1
global_name:rac

 

rac节点2:
操作系统:redhat ES5.4
oracle版本:10.2.0.4(64位)
实例名:rac2
数据库名:rac
public ip地址:192.168.1.101
vip:192.168.1.51
priv ip地址:10.0.0.2
global_name:rac

数据库存放在磁盘阵列上,并使用了oracle的分布式文件系统ocfs.

目标数据库(单实例数据库):
操作系统:redhat ES5.4
oracle版本:10.2.0.4(64位)
数据库名:racbak
ip地址:192.168.1.200
global_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 list
SQL>alter database archivelog
完成后将数据库关闭并修改/home/oracle/pfilerac.ora中的*.cluster_database=true

创建新的spfile
sqlplus "/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链路数设置

 

目标数据库初始化参数及归档模式设置:
在此不再多说,请参考前面一章中的相关内容

二、设置源和目标数据库初始化参数及归档模式

sqlplus "/as sysdba";
SQL>create pfile='/home/oracle/pfile.ora' from spfile;
修改生成的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链路数设置
下面两个参数主要是用于归档
*.log_archive_dest_1='LOCATION=/home/oracle/archivelog'
*.log_archive_format='%t_%s_%r.dbf'

注意streams_pool_size一定要够大,因为如果启用了SGA_TARGET,ORACLE可能分配很少内存给stream,这样就会导致大量信息被spill到磁盘,从而导致查询DBA_APPLY,DBA_CAPTURE,DBA_PROPGATION全部状态为ENABLED,但就是没有数据被同步。

SQL>shutdown immediate
SQL>startup mount pfile='/home/oracle/pfile.ora'
SQL>create spfile from pfile='/home/oracle/pfile.ora'
SQL>alter database archivelog;
SQL>archive log list
SQL>shutdown immediate

SQL>startup 

三、创建stream用户相关环境
略,请参考前面一章中的相关内容

 三、创建stream用户相关环境

源数据库orcl上的操作
CREATE TABLESPACE stream DATAFILE '/u01/app/oracle/oradata/orcl/stream01.dbf' SIZE 100M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED; #源数据库增加stream表空间
execute dbms_logmnr_d.set_tablespace('stream'); #将logminer的数据字典从system表空间转移到新建的表空间,防止撑满system表空间
CREATE USER strmadmin IDENTIFIED BY strmadmin DEFAULT TABLESPACE stream QUOTA UNLIMITED ON stream;#创建stream用户
GRANT DBA to strmadmin;   #10g要求dba角色以简化配置
exec DBMS_STREAMS_AUTH.GRANT_ADMIN_PRIVILEGE('strmadmin'); # 赋予流管理特权
目标数据库orclbak上的操作
CREATE TABLESPACE stream DATAFILE '/home/oracle/oradata/orclbak/stream01.dbf' SIZE 100M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;从数据库增加stream表空间
execute dbms_logmnr_d.set_tablespace('stream'); #将logminer的数据字典从system表空间转移到新建的表空间,防止撑满system表空间
CREATE USER strmadmin IDENTIFIED BY strmadmin DEFAULT TABLESPACE stream QUOTA UNLIMITED ON stream;#创建stream用户
GRANT DBA to strmadmin;   #10g要求dba角色以简化配置
exec DBMS_STREAMS_AUTH.GRANT_ADMIN_PRIVILEGE('strmadmin'); # 赋予流管理特权

 

四、配置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的名字跟对应的数据库名一样

 五、创建DB_Link

在源端建到目标库的db_link
先在目标数据库确定global_name
SQL>select * from global_name;
GLOBAL_NAME
-------------------
orclbak.REGRESS.RDBMS.DEV.US.ORACLE.COM
注意:这时我们发现目标数据库的global_name后面带有默认的域名REGRESS.RDBMS.DEV.US.ORACLE.COM,当用命令alter database rename global_name to orclbak;在目标数据库上进行域名修改时,
修改的global_name(oradb)还是会带上默认的域名REGRESS.RDBMS.DEV.US.ORACLE.COM,在参数global_name=true情况下我们不需要带默认的域名,则执行下面语句进行解决
SQL>update props$ set value$ = 'orclbak' where name = 'GLOBAL_DB_NAME';  
SQL>commit;
然后再在源数据库上创建 db_link
SQL> conn strmadmin/strmadmin;
SQL> create database link orclbak connect to strmadmin identified by strmadmin using 'orclbak';
测试:
SQL> select * from global_name@orclbak;

GLOBAL_NAME
-------------------
orclbak

在目的端建到源库的db_link
同样也要先在源库上确定global_name
SQL>select * from global_name;
GLOBAL_NAME
-------------------
orcl.REGRESS.RDBMS.DEV.US.ORACLE.COM
修改global_name
SQL>update props$ set value$ = 'orclbak' where name = 'GLOBAL_DB_NAME';  
SQL>commit;
然后再在目标数据库上创建 db_link
SQL>conn strmadmin/strmadmin;
SQL>create database link orcl connect to strmadmin identified by strmadmin using 'orcl';
测试:
SQL>select * from global_name@orcl;
GLOBAL_NAME
-------------------
orcl
这样两边的db_link都创建好了。

其实上面的二、三、四、五步是答应到前面一章<<oracle10g stream单表复制(本地捕获)>>中的四、五、六、七步,之所以又要列出来,是为了给大家知道目前是一个最干净的环境,以免受前面一章的影响。

 

六、在源库和目标库创建directory
略,请参考前面一章中的相关内容,rac上只在一个节点创建一次就可以了(数据库就一个),注:rac生成的directory最好在阵列上,跟归档目录/home/oracle/archivelog情况一样

 六、在源库和目标库创建directory

在源数据库orcl上(必须先手工创建/home/oracle/orcldump目录)
SQL>conn strmadmin/strmadmin;
SQL>create directory orcldump as '/home/oracle/orcldump';
SQL>grant read,write on directory  orcldump to ydmm,strmadmin,system;
在目标数据库orclbak上(必须先手工创建/home/oracle/orclbakdump目录)
SQL>conn strmadmin/strmadmin;
SQL>create directory orclbakdump as '/home/oracle/orclbakdump';
SQL>grant read,write on directory  orclbakdump to ydmm,strmadmin,system;

 

七、执行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; 
/

参数说明: 
DBMS_UTILITY.UNCL_ARRAY:数组变量,执行MAINTAIN_TABLES时指定的table_names所对应的表名。
Table_names :没啥好说的,就是上面数组变量中所对应的表名
source_database : 源数据库上创建的目录(directory)
destination_database :  目标数据库上创建的目录(directory)
source_datebase :连接到源端数据库的数据库链 。 
destination_database :连接到目标端数据库的数据库链 。
perform_actions :如果为true,则过程直接执行。如果为false,则过程并不直接生成复制环境,而是创建复制环境的配置脚本,由dba手动执行(或修改编辑后执行),因此必须同时设置script_name和script_directory_object两参数,指定脚本输出路径和脚本文件名,不然过程执行将直接报错。 
bi_directional :true时表示启用双向复制。false表示源库向目录库单向复制。
include_ddl :是否同步ddl语句 。
instantiation:该参数用来指定是否执行实例化,有如下几种值: 
DBMS_STREAMS_ADM.INSTANTIATION_TABLE :通过expdp/impdp初始化数据,并在目标端导入数据时执行实例化,默认情况下即是该值。 
DBMS_STREAMS_ADM.INSTANTIATION_TABLE_NETWORK :impdp直接通过网络传输数据而不生成dmp文件。在导入数据时执行实例化。 
DBMS_STREAMS_ADM.INSTANTIATION_NONE :不执行实例化,该属性值仅当perform_actions参数设置为false时有效。

在此我将直接执行过程,因此我将perform_actions设置成了true,同时取消了脚本的生成配置,结果执行如下:
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      => 'orcldump', 
destination_directory_object => 'orclbakdump', 
source_database              => 'orcl', 
destination_database         => 'orclbak', 
perform_actions              => true, 
dump_file_name               => 'export_tbls.dmp', 
log_file                     => 'export_tbls.log', 
bi_directional               => false, 
include_ddl                  => true, 
instantiation                => DBMS_STREAMS_ADM.INSTANTIATION_TABLE); 
END; 
/

这样便完成了多表单向复制(本地捕获)的操作了,执行的这个过程主要包括以下几步
1、源数据上3个表的导出
2、将导出的表传到目标数据库并导入
3、源和目标数据库流队列的创建
4、源数据上的捕获进程与传播进程的创建与启动
5、目标数据库上的应用进程创建与启动
6、目标数据库上设置应用进程开始执行的SCN
这些我们都可以通过相关的查询语句进行查询,请参考前面一章<<oracle10g stream单表复制(本地捕获)>>中的资料,在此不再叙述。

 

注意:在此instantiation参数我们使用了DBMS_STREAMS_ADM.INSTANTIATION_TABLE_NETWORK值,这样就不产生dmp文件而直接将数据传入了目标数据库,所以将dump_file_name、log_file两个参数也取消了。

 

八、测试验证
可以分别在rac1和rac2上进行操作,看是否同步到目标数据库,具体操作,请参考前面一章中的相关内容。

十五、测试验证
在源数据库上update,delete,insert一条语句,然后查看目标数据库是否同步,在此,我紧做一次update语句,其他的请自行测试
在源数据库上的操作:
SQL>conn ydmm/ydmm
SQL>select name from user where user_id=10;
name
-------------------
aobama

SQL>update user set name='wahaha' where user_id=10;
SQL>commit;
SQL>select name from user where user_id=10;
name
-------------------
wahaha

在目标数据库上进行查询确定是否同步:
SQL>conn ydmm/ydmm
SQL>select name from user where user_id=10;
name
-------------------
wahaha

至此,单表复制(本地捕获)已经完成

 

十六、清除所有stream配置信息
当不需要复制并要清除 Stream配置信息时,需要先执行停止Stream相关进程然后再清除配置。
以strmadmin身份,登录源数据库。
SQL>connect strmadmin/strmadmin
SQL>exec dbms_capture_adm.stop_capture("capture_streams");
SQL>exec dbms_propagation_adm.stop_propagation("orcl_to_orclbak"); 
SQL>exec DBMS_STREAMS_ADM.remove_streams_configuration();
以strmadmin身份,登录从数据库。
SQL>connect strmadmin/strmadmin
SQL>exec dbms_apply_adm.stop_apply("apply_streams"); 
SQL>exec DBMS_STREAMS_ADM.remove_streams_configuration();

 

注意事项:
不能update主键,否则会导致stream应用失效

时间: 2024-09-19 04:56:40

oracle10g rac stream 多表复制(本地捕获)的相关文章

AIX5.3 ORACLE10G RAC环境境新建lv务必注意两个节点权限同步

AIX5.3 ORACLE10G RAC环境,新建LV时由于CHMOD.CHOWN未在两个节点同步,导致未设置权限的节点报ORA-01186\ORA-01157\ORA-01110错误,后对数据文件紧急下线过程中又出现数据文件问题,最后通过Media recovery恢复.该案例告诉我们务必注意两个节点权限的同步,即使不同步也不要轻易OFFLINE,可尝试重启之前未同步的节点. --实际步骤-- 新建data36_disk数据文件 通过smit lv PP SIZE:        256 me

Excel工作表复制与移动技巧

在使用Excel时,经常会需要在工作表间复制或移动数据,或者干脆复制整个工作表.复制一个工作表中所有单元格的内容和复制整个工作表是有区别的,下面分别介绍复制或移动的方法. 1.复制与粘贴工作表中的所有单元格 这是大多数人经常会用到的一种方法,也比较方便易行.具体操作步骤如下. (1)按Ctrl+A键选中所有单元格(在Excel 2003中,如果要选中工作表中所有单元格,需要在按Ctrl+A之前先选中空白区域中的一个单元格:如果事先选中的是数据区域的一个单元格,则按Ctrl+A选中的是整个包含数据

ORACLE10G RAC+AIX53下如何提取AWR报告

本文介绍ORACLE10G RAC+AIX53环境下AWR报告提取过程. 1.如果不在oracle用户下请切换到oracle用户   su - oracle 2.以sysdba权限登录数据库   sqlplus "/as sysdba" 3.执行awrprt命令   SQL> @?/rdbms/admin/awrrpt 4.出现选择awr的输出格式界面(默认选HTML比较直观)   ----------------------------------------------- C

SELECT INTO 和 INSERT INTO SELECT 两种表复制语句

  Insert是T-sql中常用语句,Insert INTO table(field1,field2,...) values(value1,value2,...)这种形式的在应用程序开发中必不可少.但我们在开发.测试过程中,经常会遇到需要表复制的情况,如将一个table1的数据的部分字段复制到table2中,或者将整个table1复制到table2中,这时候我们就要使用SELECT INTO 和 INSERT INTO SELECT 表复制语句了. 1.INSERT INTO SELECT语句

MySQL 关于表复制 insert into 语法的详细介绍

web开发中,我们经常需要将一个表的数据插入到另外一个表,有时还需要指定导入字段,设置只需要导入目标表中不存在的记录,虽然这些都可以在程序中拆分成简单sql来实现,但是用一个sql的话,会节省大量代码.下面我以mysql数据库为例分情况一一说明:两张表:insertTest和insertTest2,前者中有测试数据 复制代码 代码如下: create table insertTest(id int(4),name varchar(12)); insert into insertTest valu

Excel数据表复制到Word后出现越界怎么办

  Excel中的数据表复制到Word后,表格样式常会出现越界的情况,超出版心,内容被截掉了. 遇到这种问题肿么办?这里有两种解决办法. ● 自动重排 再现完整内容 之所以会出现上面这样的情况,主要是因为Word文档中表格的"自动调整"属性默认为"根据内容调整表格",如果要转换的Excel工作表的数据宽度超过了当前Word文档页面的宽度,直接粘贴之后就会发生表格被截掉的混乱. 要想解决这个问题,请不要急着手动拖拽表格,那样可能会乱上加乱.而是首先需要选中该表格,右击

select into 和 insert into select 全表复制sql语句

Insert是T-sql中常用语句,Insert INTO table(field1,field2,...) values(value1,value2,...)这种形式的在应用程序开发中必不可少.但我们在开发.测试过程中,经常会遇到需要表复制的情况,如将 一个table1的数据的部分字段复制到table2中,或者将整个table1复制到table2中,这时候我们就要使用SELECT INTO 和 INSERT INTO SELECT 表复制语句了. 区别  代码如下 复制代码 select *

sql-将一个数据库中的所有表复制到另一个数据库中

问题描述 将一个数据库中的所有表复制到另一个数据库中 两个数据库不在一个服务器上!!! 比如我本机的ip地址为11.12.13.15 数据库名称为sqljiang 登陆名和密码分别为sa和sa123 服务器的ip为22.33.55.66 数据库名称为sqlfwqsjl 服务器中的数据库是空的 现在我想将本机sqljiang中的所有信息完整复制到服务器中,包括表结构. 表中的数据.视图.存储过程等,如何通过脚本实现. 由于服务器没有这么大的权限,因此不能通过直接还原数据库备份的方法... 解决方案

AWR报告提取 ORACLE10G RAC+AIX53

ORACLE10G RAC+AIX53 AWR报告提取(ORACLE10G RAC+AIX53) 1.如果不在oracle用户下请切换到oracle用户    su - oracle 2.以sysdba权限登录数据库    sqlplus "/as sysdba" 3.执行awrprt命令    SQL> @?/rdbms/admin/awrrpt 4.出现选择awr的输出格式界面(默认选HTML比较直观)    ---------------------------------