用户级流互置配置过程:
1、配置数据库环境
alter system set global_names=true scope = both;
要求global_names为true,即建立的数据库链接名要与目标数据库服务名一致,流互置环境用数据库链路来识别远程库和远程库上的队列等。
另外规则集中包含发生改变的数据库名,这些数据库名都用数据库链接名来标识。
alter system set compatible='10.2.0.3' scope=spfile;
使用10gR2关于流的新特征(如子集分割规则等)。
alter system set job_queue_processes = 10 scope=both;
传播用oracle的定时作业实现。Oracle作业队列后台进程(J000-J999)处理包括流传播在内的所有作业。
alter system set aq_tm_processes=1 scope=both;
用于监控和维护所有系统和用户的高级队列AQ对象的后台进程(q000-q009和qmnc,前者由后者按需调度产生;9i需要明确定义,没有调度进程,名为qmn0-qmn9)
alter system set logmnr_max_persistent_sessions=2 scope=spfile;
持久的日志挖掘会话数。10g无需设置次参数
alter system set parallel_max_servers=135 scope=both;
最大的并行服务会话数。
流捕获进程由读服务、准备服务、构建服务和后台捕获进程组成,前三个是并行服务。流应用进程有读服务、后台协作进程和应用服务组成。所以,仅有捕获进程时,至少最大并行服务数为3;仅有应用进程时,最大并行服务数至少为2.
alter system set open_links=4 scope=spfile;
一个会话同时打开的远程连接数。
startup database archivelog mode;
源数据库要处于归档日志模式
alter system set sga_target = 4g scope=spfile;
使能自动共享内存管理
alter system set streams_pool_size = 0 scope=both;
使能自动流池管理
alter system set statistics_level='TYPICAL' scope=both;
性能统计模式
alter system set undo_retention=3600 scope=both;
alter system set "_job_queue_interval"=1 scope=spfile;
作业队列协调者以秒计的唤醒间隔时间(缺省为5秒)
2、流管理用户配置
为日志挖掘建立独立的表空间:
connect sys/manager@hnds1 as sysdba;
CREATE TABLESPACE logmnr_tbs DATAFILE '/data/hnds1/logmnr.dbf' SIZE 1023M;
BEGIN DBMS_LOGMNR_D.SET_TABLESPACE('logmnr_tbs'); END;
/
源端使能数据库级补充日志登载:
connect sys/manager@orclsrc as sysdba;
alter database add supplemental log data (PRIMARY KEY, UNIQUE, FOREIGN KEY) columns;
建流管理用户和授权(源端、目端都有):
connect SYS/manager@orclsrc as SYSDBA
REM 流管理用户使用独立的表空间:
create user SRADM identified by SRADM;
CREATE TABLESPACE sradm_tbs DATAFILE '/data/hnds1/stadm.dbf' SIZE 2000M REUSE;
ALTER USER sradm DEFAULT TABLESPACE sradm_tbs QUOTA UNLIMITED ON sradm_tbs;
GRANT DBA to SRADM; /* 10g要求dba角色以简化配置 */
exec DBMS_STREAMS_AUTH.GRANT_ADMIN_PRIVILEGE('SRADM'); /* 赋予流管理特权 */
connect sradm/sradm@orclsrc; /* 以下在源端建到目库的db link */
create database link orcl.yysw.com connect to sradm identified by sradm using 'orcl.yysw.com';
connect sradm/sradm@orcldst; /* 以下在目端建到源库的db link */
create database link orcl.yysf.com connect to sradm identified by sradm using 'orcl.yysf.com';
3、流互置目端配置
建目库应用进程使用的队列表和队列:
connect sradm/sradm@orcldst;
BEGIN
DBMS_STREAMS_ADM.SET_UP_QUEUE(
queue_table => 'SR_Q_TAB', --队列表
queue_name => 'SR_Q_01', --队列
queue_user => 'SRADM'); --队列用户
END;
/
建应用进程和用户上的应用规则
BEGIN
DBMS_STREAMS_ADM.ADD_SCHEMA_RULES(
schema_name => ' YYSYS', --要应用的用户
streams_type => 'APPLY', --流类型为应用进程
streams_name => 'SRADM_A_01', --应用进程名
queue_name => 'SRADM.SR_Q_01', --应用进程从其出列LCRs的队列名
include_dml => true, --建立缺省DML规则
include_ddl => true, --建立缺省DDL规则
source_database => 'ORCL.YYSF.COM'); --源库名
END;
/
指定应用的用户和应用进程属性(出错也不终止):
BEGIN
DBMS_APPLY_ADM.ALTER_APPLY(
apply_name => 'SRADM_A_01', --应用进程名
apply_user => 'YYSYS'); --应用进程要应用到的用户
END;
/
BEGIN
DBMS_APPLY_ADM.SET_PARAMETER(
apply_name => 'SRADM_A_01',
parameter => 'DISABLE_ON_ERROR',
value => 'N' );
END;
/
最后,启动应用进程:
DECLARE
v_started number;
BEGIN
SELECT decode(status, 'ENABLED', 1, 0) INTO v_started
FROM DBA_APPLY WHERE APPLY_NAME = 'SRADM_A_01';
if (v_started = 0) then
DBMS_APPLY_ADM.START_APPLY(apply_name => 'SRADM_A_01');
end if;
END;
/
4、流互置原端配置
建捕获进程使用的流队列:
connect sradm/sradm@orclsrc;
BEGIN
DBMS_STREAMS_ADM.SET_UP_QUEUE(
queue_name =>'SR_Q_01', --队列名
queue_table => 'SR_Q_TAB', --队列表名
queue_user => 'SRADM'); --队列用户
END;
/
建捕获进程和捕获规则:
建用户一级捕获进程和缺省捕获规则
BEGIN
DBMS_STREAMS_ADM.ADD_SCHEMA_RULES(
schema_name => 'YYSYS', --要捕获的用户名
streams_type => 'CAPTURE', --流类型为捕获
streams_name => 'SRADM_C_01', --捕获进程名
queue_name => 'SRADM.SR_Q_01',
--捕获进程要入列LCR的队列名
include_dml => true, --增加DML规则
include_ddl => true, --增加DDL规则
source_database => 'ORCL.YYSF.COM');
END;
/
5、流互置传播配置
建队列到队列的传播和缺省传播规则
BEGIN
DBMS_STREAMS_ADM.ADD_SCHEMA_PROPAGATION_RULES(
schema_name => 'YYSYS', --要传播改变的用户名
streams_name => 'SRADM_P_01', --传播名
source_queue_name => 'SRADM.SR_Q_01', --传播的源队列
destination_queue_name => 'SRADM.SR_Q_01@ORCL.YYSW.COM',
--传播的目队列
include_dml => true, --建立dml规则
include_ddl => true, --建立ddl规则
source_database => 'ORCL.YYSF.COM',
queue_to_queue => true);
END;
/
6、实例化
可用imp和exp完成实例化。
带数据完成源端exp和目端的import:
exp USERID=SYSTEM/manager@hnds1 OWNER=HNDS_AS FILE=hnds_as.dmp LOG=exportTables.log OBJECT_CONSISTENT=Y STATISTICS = NONE
imp USERID=SYSTEM/manager@oracs FULL=Y CONSTRAINTS=Y FILE=hnds_as.dmp IGNORE=Y COMMIT=Y LOG=importTables.log STREAMS_INSTANTIATION=Y
或仅作实例化(不带数据):
exp USERID=SYSTEM/creator@orcl.yysf.com OWNER=yysys FILE=yysf.dmp LOG=exportTables.log OBJECT_CONSISTENT=Y STATISTICS = NONE ROWS=NO
imp USERID=SYSTEM/creator@orcl.yysw.com FULL=Y CONSTRAINTS=Y FILE=yysf.dmp COMMIT=Y LOG=importTables.log STREAMS_INSTANTIATION=Y IGNORE=Y
也可用直接设置SCN的方式进行实例化:
---获取源库互置用户的SCN
connect SRADM/SRADM@orclsrc
set serveroutput on
DECLARE
iscn NUMBER; -- Variable to hold instantiation SCN value
BEGIN
iscn := DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER();
DBMS_OUTPUT.PUT_LINE ('Instantiation SCN is: ' || iscn);
END;
/
---设置为目标库互置用户的SCN
connect SRADM/SRADM@orcldst
BEGIN
DBMS_APPLY_ADM.SET_SCHEMA_INSTANTIATION_SCN(
source_schema_name => 'YYSYS',
source_database_name => 'ORCL.YYSF.COM',
instantiation_scn => &iscn);
END;
/
最后启动捕获进程:
connect SRADM/SRADM@orclsrc
BEGIN
DBMS_CAPTURE_ADM.START_CAPTURE(capture_name => 'SRADM_C_01');
END;
/
7、配置心跳表机制
connect yysys/yysys@orclsrc
alter session set nls_date_format='YYMMDD[HH24:MI:SS]';
create table htbt(name varchar2(10) not null, rqsj date default sysdate not null);
alter table htbt add constraint PK_HTBT primary key (name);
set serveroutput on
variable jobno number;
variable instno number;
begin
select instance_number into :instno from sys.v_$instance;
dbms_job.submit(:jobno, 'update yysys.htbt set rqsj=sysdate;', trunc(sysdate+1/24/60,'MI'), 'trunc(SYSDATE+1/24/60,''MI'')', TRUE, :instno);
commit;
end;
|||||||||||||||||||||||||||||||||||||||||||||||||
alter session set nls_date_format='yymmdd{hh34:mi:ss}';
select * from htbt;