2013年(350)
分类: Oracle
2013-04-27 09:40:47
这里单源复制环境不是是说数据都从一处来,而是指单个对象的仅来源于一处,但可能有多个同时捕获数据。在启动capture 进程和配置传播前,确认已经配置了propagation和apply进程处理相关LCRs。
设定条件如下:
在本节演示进行之前,必须首先满足下列条件(下列操作除非特别指定,否则源端和目标端都需要执行,某些操作请注意转换路径,这里不再一一列举):
初始化参数设置:
数据库置为归档模式
通常建议Streams复制环境中的数据库均启用归档,不过如果你的复制为单向,则目标端也可以不启用归档。如何启用前文已有描述,不多说了。
配置TNSNAMES
两种方式,手工修改$ORACLE_HOME\network\admin\tnsnames.ora文件,或者通过netca界面化方式配置,都比较简单,这里不再演示了。
创建员帐户
a>. 首先创建新的表空间(不建议streams管理员默认表空间与其它业务用表空间混用,尤其不建议使用system表空间)
JSSWEB> create tablespace strmtbs datafile ¨ /data/oradata/jssweb/ strmtbs01.ora¨ size 200m;
Tablespace created.b>. 创建streams管理员帐号并授予权限,这里创建strmadmin做为streams管理员并授予dba权限
JSSWEB> create user strmadmin identified by strmadmin default tablespace strmtbs quota unlimited on strmtbs;
User created.
JSSWEB> grant dba to strmadmin;
User created.首先在源端操作:
SQL> conn strmadmin/strmadmin
Connected.
JSSWEB> set sqlprompt "JSSWEB> "
JSSWEB> exec dbms_streams_adm.set_up_queue();
PL/SQL procedure successfully completed.
JSSWEB> create database link jssstr connect to strmadmin identified by strmadmin using ¨jssstr_172.25.13.231¨;
Database link created.
JSSWEB> select sysdate from dual@jssstr;
SYSDATE
--------------
24-3 月 -09转到目标端做相同操作(由于是单向复制,dblink可以不创建):
SQL> conn strmadmin/strmadmin
Connected.
JSSSTR> set sqlprompt "JSSSTR> "
JSSSTR> exec dbms_streams_adm.set_up_queue();
PL/SQL procedure successfully completed.提示:dbms_streams_adm.set_up_queue()是做什么的?
该过程语法如下:
DBMS_STREAMS_ADM.SET_UP_QUEUE(
queue_table IN VARCHAR2 DEFAULT ¨streams_queue_table¨,
storage_clause IN VARCHAR2 DEFAULT NULL,
queue_name IN VARCHAR2 DEFAULT ¨streams_queue¨,
queue_user IN VARCHAR2 DEFAULT NULL,
comment IN VARCHAR2 DEFAULT NULL);
执行该过程后会执行下列操作:
注意如果你自己指定streams_queue_table和streams_queue名称的话,长度不要超过24个字节。
注意下列操作除非特别说明,否则所有操作均是在strmadmin下进行。
1、 源端配置Propagation进程
JSSWEB> BEGIN
2 DBMS_STREAMS_ADM.ADD_TABLE_PROPAGATION_RULES(
3 table_name => ¨member.usr_user¨,
4 streams_name => ¨web_to_str¨,
5 source_queue_name => ¨strmadmin.streams_queue¨,
6 destination_queue_name => ¨strmadmin.streams_queue@jssstr.jss.cn¨,
7 include_dml => true,
8 include_ddl => true,
9 source_database => ¨jssweb.jss.cn¨,
10 inclusion_rule => true,
11 queue_to_queue => true);
12 END;
13 /
PL/SQL procedure successfully completed.2、 源端配置Capture进程
JSSWEB> BEGIN
2 DBMS_STREAMS_ADM.ADD_TABLE_RULES(
3 table_name => ¨member.usr_user¨,
4 streams_type => ¨capture¨,
5 streams_name => ¨jssweb_capture_tbl¨,
6 queue_name => ¨strmadmin.streams_queue¨,
7 include_dml => true,
8 include_ddl => true,
9 inclusion_rule => true);
10 END;
11 /
PL/SQL procedure successfully completed.3、 目标端设置member.usr_user表的实例scn
本例中设定源端和目标端都已经存在member.usr_user表,并且两表内容一致。由于表已存在,因此你需要手动设置实例scn。
JSSSTR> DECLARE
2 iscn NUMBER; -- Variable to hold instantiation SCN value
3 BEGIN
4 iscn := DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER();
5 DBMS_APPLY_ADM.SET_TABLE_INSTANTIATION_SCN@jssstr.jss.cn(
6 source_object_name => ¨member.usr_user¨,
7 source_database_name => ¨jssweb.jss.cn¨,
8 instantiation_scn => iscn);
9 END;
10 /
PL/SQL procedure successfully completed.本步很重要,一旦操作不对极有可能造成源和目标端不一致,并导致同步失败。建议从执行此操作开始,到源端启用capture进程前,源端都不要对member.usr_user表做任何修改。
如果目标端尚不存在要同步的表,则你可以通过exp/imp导入该表,imp导入时会自动实例scn。
4、 目标端配置Apply进程
JSSSTR> BEGIN
2 DBMS_STREAMS_ADM.ADD_TABLE_RULES(
3 table_name => ¨member.usr_user¨,
4 streams_type => ¨apply¨,
5 streams_name => ¨jssstr_apply_tbl¨,
6 queue_name => ¨strmadmin.streams_queue¨,
7 include_dml => true,
8 include_ddl => true,
9 source_database => ¨jssweb.jss.cn¨,
10 inclusion_rule => true);
11 END;
12 /
PL/SQL procedure successfully completed.5、 目标端启动Apply进程
JSSSTR> exec dbms_apply_adm.start_apply(¨jssstr_apply_tbl¨);
PL/SQL procedure successfully completed.6、 源端启动Capture进程
JSSWEB> exec dbms_capture_adm.start_capture(¨jssweb_capture_tbl¨);
PL/SQL procedure successfully completed.DML 操作测试:
JSSWEB> insert into member.usr_user values (100,¨Group user1¨);
1 row created.
JSSWEB> alter system switch logfile;
System altered.
JSSWEB> select count(0) from member.usr_user@jssstr;
COUNT(0)
----------
10成功。
DDL 操作测试:
JSSWEB> truncate table member.usr_user;
Table truncated.
JSSWEB> alter system switch logfile;
System altered.
JSS > select count(0) from member.usr_user @jssstr ;
COUNT(0)
----------
0竣工。
======================================