通过前面一章<<oracle10g stream单表复制(本地捕获)>>,我们已经知道了stream的实现过程,但在实际应用中,单个表的复制使用的情况还是非常少的,下面我们将介绍通过stream实现多表复制的方法。这次我们将直接使用DBMS_STREAMS_ADM.MAINTAIN_TABLES过程进行创建stream环境,也就是运行一个过程的事情,就能解决多表复制的问题,看起来是不是很简单,费话少说,开始吧
一、前提条件:
源数据库:
操作系统:redhat ES5.4
oracle版本:10.2.0.4(64位)
数据库名:orcl
ip地址:192.168.1.10
global_name:orcl
目标数据库:
操作系统:redhat ES5.4
oracle版本:10.2.0.4(64位)
数据库名:orclbak
ip地址:192.168.1.11
global_name:orclbak
同步orcl数据库中ydmm用户下的user、product、price表,同时orabak数据库中必须要有ydmm用户,最好保持密码相同,单向同步,即源同步到目标。
源数据库与目标数据库的字符集一定要相同,否则会在导入数据同步的时候报错!
二、设置源和目标数据库初始化参数及归档模式
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用户相关环境
源数据库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
在源数据库上的tnsnames.Ora增加如下连接信息
orclbak =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.11)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orclbak)
)
)
在目标数据库上的tnsnames.Ora增加如下连接信息
orcl =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.10)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SID = orcl)
)
)
五、创建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
在源数据库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 => 'orcldump',
destination_directory_object => 'orclbakdump',
source_database => 'orcl',
destination_database => 'orclbak',
perform_actions => false,
dump_file_name => 'export_tbls.dmp',
log_file => 'export_tbls.log',
script_name => 'configure_rep.sql',
script_directory_object => 'orcldump',
bi_directional => false,
include_ddl => true,
instantiation => DBMS_STREAMS_ADM.INSTANTIATION_TABLE);
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单表复制(本地捕获)>>中的资料,在此不再叙述。
八、测试验证
略,请参考前面一章<<oracle10g stream单表复制(本地捕获)>>中的测试验证
注:如果增加其他的表复制,只要执行上面第七步中的过程便可!
分享到:
相关推荐
STREAM的功能还是十分强大的,通过配置ORACLE STREAM可以更大的提升数据库的和安全性,如此一个好用且不用花费高昂额外费用的功能还是很值得一用。
到了Oracle 10g,有了DBMS_STREAMS_ADM之后,Stream流复制已经很好配置了 下面的只是一个最简单的stream流复制,不涉及复杂的rule配置 环境: OS:Redhat Linux Oracle 10.2.0.2 source:stream1 destnation:stream2
oracle10G和11G的OCI.dll,主要用于navicat工具;oracle10G和11G的OCI.dll,主要用于navicat工具
ORACLE 10G 数据库 通过STREAM实现数据库双向同步
Linux 中安装 ORACLE10g 数据库详细步骤 Linux 是一个开源的操作系统,在服务器应用中广泛使用。ORACLE 是一个关系型数据库管理系统,是当前最流行的数据库管理系统之一。安装 ORACLE10g 数据库需要在 Linux 操作...
Oracle10g-linux安装包
oracle,Oracle10g在Oracle10g上的安装与配置
文件是本人oracle10g分区表自动按时间创建、删除分区的存储过程,测试代码,通过job调用存储过程,每天午夜12点运行一次。妥妥!跟大家分享下!
oracle数据库驱动。包含了oracle oracle10g、11g、12c、19c的jar驱动包。解压密码是123456。
redhat5 下安装oracle10g redhat6下安装oracle11g 详细到装虚拟机,文件配置,安装详细过程
oracle 10g 数据库免费 安装版,这个是一个百度云的下载地址,有需要的自己下载,这个oracle数据库有600多m,本人觉得挺好用的,希望能帮助到你们
Linux下Oracle 10g安装 有不少网友需要,学习在Linux上从头安装 Oracle 数据库 10g 的基础知识(仅用于评估)。
racle10gjdbc驱动是一款的数据库驱动软件。大家在使用racle10gjdbc程序之前需要在电脑端安装这个驱动,...驱动介绍racle10gjdbc驱动程序,运用在java连接oracle10g。oracle10gjdbc驱动包存放位置为E:\orac,欢迎下载体验
最新的Oracle 10g价格表,是国内一家代理商出示的
中文名: Oracle 10g Client 快速安装包英文名: Oracle 10g Client别名: Oracle10g Client资源格式: 压缩包版本: Oracle10g地区: 大陆语言: 简体中文简介: Oracle10g Client的快速安装包,本人使用过几次,都是外出...
ORACLE10G安装步骤ORACLE10G安装步骤ORACLE10G安装步骤
oracle 11g ,10g软件资源 百度云下载
Oracle10G数据库系统教程02-0003 10 Oracle10G数据库系统教程02-0003 10 Oracle10G数据库系统教程02-0006 10 Oracle10G数据库系统教程01-0002 11 Oracle10G数据库系统教程01-0003 11 Oracle10G数据库系统教程01-0004...
Aix6100_Oracle10g_rac新增表空间