这里单源复制环境不是是说数据都从一处来,而是指单个对象的仅来源于一处,但可能有多个数据库同时捕获数据。在启动capture 进程和配置传播前,确认已经配置了propagation和apply进程处理相关LCRs。
一、 需求描述
设定条件如下:
- 源数据库 sid : jssweb ,目标库 : jssstr
- 复制单表member.usr_user
- 源库本地捕获 ,单向同步。
- 同步 DML/ DDL 操作
二、 准备工作
在本节演示进行之前,必须首先满足下列条件(下列操作除非特别指定,否则源端和目标端都需要执行,某些操作请注意转换路径,这里不再一一列举):
初始化参数设置:
- GLOBAL_NAMES :是否启用全局名称,必须设置为true;
- JOB_QUEUE_PROCESS :最大可启用的任务队列进程数,运行propagation进程的数据库中,该值不能低于2;
- COMPATIBLE :兼容版本,不能低于10.2.0.1;
- STREAMS_POOL_SIZE :流缓冲池,建议不低于200M。
数据库置为归档模式
通常建议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.
三、 创建ANYDATA队列和数据库链
首先在源端操作:
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(默认情况下)的队列并启动该队列;
注意如果你自己指定streams_queue_table和streams_queue名称的话,长度不要超过24个字节。
四、 创建capture、propagation、apply进程
注意下列操作除非特别说明,否则所有操作均是在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 WEB > select count(0) from member.usr_user @jssstr ;
COUNT(0)
----------
0
竣工。
|