分类: Oracle
2010-02-12 04:30:05
数据库:sc_source 和 sc_dest
要求:将sc_source中的product用户下的所有对象都复制到sc_dest上去
一,准备工作:
1.1 将sc_source和sc_dest数据库都置于归档模式
1.2 如果有些表没有主键,为保证复制的准确性,需要在源数据库(sc_source)上配置辅助日志
alter database add supplemental log data(primary key,unique) columns;
1.3 源,目标库设置一些参数
job_queue_processes=4
aq_tm_processes=4
global_names=true
1.4 创建流复制的管理用户
源,目标库都需要配置
create tablespace streams_tbs datafile '/oracle/oradata/streams_tbs01.dbf' size 1024M;
create user strmadmin identified by strmadmin default tablespace streams_tbs quota unlimited on streams_tbs;
grant dba,select_catalog_role to strmadmin;
1.5 创建数据库连接
sc_source:
create database link sc_dest.net connect to strmadmin identified by strmadmin using 'sc_dest';
sc_dest:
create database link sc_source.net connect to strmadmin identified by strmadmin using 'sc_source';
二,开始配置streams
sc_source
-----------------------------------
配置捕获进程队列
begin
dbms_streams_adm.set_up_queue(
queue_table => 'capture_scstab',
queue_name => 'capture_scs',
queue_user => 'strmadmin');
end;
/
sc_dest
-----------------------------------
配置应用进程队列
begin
dbms_streams_adm.set_up_queue(
queue_table => 'apply_scdtab',
queue_name => 'apply_scd',
queue_user => 'strmadmin');
end;
/
sc_source
-----------------------------------
配置捕获进程
begin
dbms_streams_adm.add_schema_rules (
schema_name => 'product',
streams_type => 'capture',
streams_name => 'capture_scstrm',
queue_name => 'capture_scs',
include_dml => true,
include_ddl => true,
inclusion_rule => true);
end;
/
配置传播进程
begin
dbms_streams_adm.add_schema_propagation_rules (
schema_name => 'product',
streams_name => 'pro_source_to_dest',
source_queue_name => 'capture_scs',
destination_queue_name => 'apply_scd@sc_dest.net',
include_dml => true,
include_ddl => true,
source_database => 'sc_source.net');
end;
/
sc_dest
--------------------------------------------------------
配置应用进程
begin
dbms_streams_adm.add_schema_rules (
schema_name => 'product',
streams_type => 'apply',
streams_name => 'apply_scdtrm',
queue_name => 'apply_scd',
include_dml => true,
include_ddl => true,
source_database => 'sc_source.net');
end;
/
三,数据的导出和导入
sc_source
-------------------------------------------------------------
先得到源库的scn号
select dbms_flashback.get_system_change_number() from dual;
然后把product用户的数据导出,我采用的是expdp工具,从上面得到scn号之前导出即可
expdp product/product directory=dumpdir dumpfile=product.dmp FLASHBACK_SCN=&SCN
将导出的数据文件传到目标数据库sc_dest上,开始导入
impdp product/product directory=dumpdir dumpfile=product.dmp
四,开始streams复制
sc_dest
---------------------------------------------------------------------------------------
为了使发生错误时,能让应用进程继续工作,可以做下面设置
begin
dbms_apply_adm.set_parameter (
apply_name => 'apply_scdtrm',
parameter => 'disable_on_error',
value => 'N');
end;
/
在目标库上开始应用进程
begin
dbms_apply_adm.start_apply (
apply_name => 'apply_scdtrm');
end;
/
sc_source
-------------------------------------------------------------------------------
在源库上开始捕获进程
begin
dbms_capture_adm.start_capture (
capture_name => 'capture_scstrm');
end;
/
五,停止方法和删除方法
exec dbms_capture_adm.stop_capture('capture_scstrm') ---停止捕获进程
exec dbms_capture_adm.drop_capture('capture_scstrm') ---删除捕获进程
exec dbms_propagation_adm.stop_propagation('pro_source_to_dest') ---停止传播进程
exec dbms_propagation_adm.drop_propagation('pro_source_to_dest') ---删除传播进程
sc_dest
exec dbms_apply_adm.stop_apply('apply_scdtrm') ---停止应用进程
exec dbms_apply_adm.drop_apply('apply_scdtrm') ---删除应用进程
做完了以上工作,即可以执行下面的操作删除streams配置了
exec dbms_streams_adm.remove_streams_configuration