您的位置:首页 > 数据库 > Oracle

oracle技术之oracle Streams 架设一个单表复制环境(2)

2013-05-29 12:01 387 查看
Streams 特性在oracle诸多特性中属于比较灵活的一个,如果你接触oracle的时候足够久,那么一定能够理解,对于oracle而言,灵活往往也意味着复杂。这样也可以,那样也可以,究竟怎样好?一直以来,俺都认为实践更加有助于理解,为了更有有效的帮助大家的理解和学习,俺决定首先通过一个简单的示例来演示streams大致的工作方法。

一、要求

1 、 初始化参数的修改

2 、 source database 必须启用归档模式

3 、 双机互相创建database link

4 、为方便区分,我们对源和目标库的操作符做初始化

SOURCE 端:

SQL> conn / as sysdba

已连接。

SQL> set sqlprompt "JSSWEB> "

TARGET 端:

SQL> conn / as sysdba

已连接。

SQL> set sqlprompt "JSS STR > "

二、创建用户及搭建环境

这里设定我们的source数据库是jssweb,target数据库是jssstr,数据库版本10201,两机准备工作均已做好(主要指上面说的那几条)

1 、一个一个来吧,首先自然是source

-- 创建一个专用于streams的表空间,很有必要

JSSWEB> create tablespace stream_tbs datafile 'E:\oracle\oradata\jssweb\stream01.dbf' size 200m;

表空间已创建。

-- 创建streams管理用户,并授予dba权限

JSSWEB> create user stradmin identified by stradmin default tablespace stream_tbs;

用户已创建。

-- 由于streams用户操作需要较多权限,此处仅用于演示,简便期间直接授予dba权限

JSSWEB> grant dba to stradmin;

授权成功。

2 、target当然也是同理,创建专用表空间及用户。

JSSSTR> create tablespace stream_tbs datafile 'E:\oracle\oradata\jssstr\stream01.dbf' size 200m;

表空间已创建。

JSSSTR> create user stradmin identified by stradmin default tablespace stream_tbs;

用户已创建。

JSSSTR> grant dba to stradmin;

授权成功。

3 、切换回source数据库,以streams的操作用户stradmin连接

JSSWEB> conn stradmin/stradmin

已连接。

创建连接到target的数据库链:

JSSWEB> create database link jssstr connect to stradmin identified by stradmin using 'jssstr';

数据库链接已创建。

JSSWEB> select sysdate from dual@jssstr;

SYSDATE

-------------------

2008-09-01 10:18:24

-- 创建队列

JSSWEB> exec dbms_streams_adm.set_up_queue();

PL/SQL 过程已成功完成。

4 、再次切换到target数据库,以streams的操作用户stradmin连接

JSSSTR> conn stradmin/stradmin

已连接。

JSSSTR> create database link jssweb connect to stradmin identified by stradmin using 'jssweb';

数据库链接已创建。

JSSSTR> select sysdate from dual@jssweb;

SYSDATE

--------------

2008-09-01 10:24:38

-- 创建队列

JSSSTR> exec dbms_streams_adm.set_up_queue();

PL/SQL 过程已成功完成。

三、配置复制过程

1 、首先到source数据库

创建捕获规则

JSSWEB> begin

2 dbms_streams_adm.add_table_rules(

3 table_name => 'scott.emp',

4 streams_type => 'capture',

5 streams_name => 'capture_stream',

6 queue_name => 'stradmin.streams_queue',

7 include_dml => true,

8 include_ddl => true,

9 inclusion_rule => true);

10 end;

11 /

PL/SQL 过程已成功完成。

创建传播规则

JSSWEB> begin

2 dbms_streams_adm.add_table_propagation_rules(

3 table_name => 'scott.emp',

4 streams_name => 'sour_to_targ',

5 source_queue_name => 'stradmin.streams_queue',

6 destination_queue_name => 'stradmin.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 过程已成功完成。

JSSWEB> select capture_name,status from dba_capture;

CAPTURE_NAME STATUS

------------------------------ --------

CAPTURE_STREAM DISABLED

2 、切换到target数据库

创建应用规则

JSSSTR> begin

2 dbms_streams_adm.add_table_rules(

3 table_name => 'scott.emp',

4 streams_type => 'apply',

5 streams_name => 'apply_stream',

6 queue_name => 'stradmin.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 过程已成功完成。

初始化数据,首先从源库导出,再执行导入,复制的方式很多,逻辑导入导出、rman、duplication之类的,基本上你想怎么操作都可以,这里因为只操作一个表,三思决定直接通过数据库链复制。

JSSSTR> create table scott.EMP

2 (

3 EMPNO NUMBER(4) not null primary key ,

4 ENAME VARCHAR2(10),

5 JOB VARCHAR2(9),

6 MGR NUMBER(4),

7 HIREDATE DATE,

8 COMM NUMBER(7,2),

9 DEPTNO NUMBER(2)

10 );

表已创建。

JSSSTR> insert into scott.emp select *from scott.emp@jssweb;

已创建13行。

JSSSTR> commit;

提交完成。

设置起始应用的scn值

JSSSTR> DECLARE

2 iscn NUMBER;

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 => 'scott.emp',

7 source_database_name => 'jssweb.jss.cn',

8 instantiation_scn => iscn);

9 END;

10 /

PL/SQL 过程已成功完成。

启动应用进程

JSSSTR> exec dbms_apply_adm.start_apply('apply_stream');

PL/SQL 过程已成功完成。

JSSSTR> select apply_name,status from dba_apply;

APPLY_NAME STATUS

------------------------------ --------

APPLY_STREAM ENABLED

3 、切换到source数据库,启动捕获进程

JSSWEB> exec dbms_capture_adm.start_capture('capture_stream');

PL/SQL 过程已成功完成。

JSSWEB> select capture_name,status from dba_capture;

CAPTURE_NAME STATUS

------------------------------ --------

CAPTURE_STREAM ENABLED

四、测试

如果一切顺利,我们的streams就配置好了,下面验证一下。

JSSWEB> select *from scott.emp where empno=7499;

EMPNO ENAME JOB MGR HIREDATE COMM DEPTNO

---------- ---------- --------- ---------- -------------- ---------- ----------

7499 ALLEN SALESMAN 7698 20-2 月 -81 300 30

JSSWEB> update scott.emp set deptno=40 where empno=7499;

已更新 1 行。

JSSWEB> commit;

提交完成。

JSSSTR> select * from scott.emp where empno=7499;

EMPNO ENAME JOB MGR HIREDATE COMM DEPTNO

---------- ---------- --------- ---------- -------------- ---------- ----------

7499 ALLEN SALESMAN 7698 20-2 月 -81 300 40

JSSWEB> alter table scott.emp add tmpcol varchar2(10);

表已更改。

JSSSTR> desc scott.emp;

名称 是否为空? 类型

--------------- -------- --------------

EMPNO NOT NULL NUMBER(4)

ENAME VARCHAR2(10)

JOB VARCHAR2(9)

MGR NUMBER(4)

HIREDATE DATE

COMM NUMBER(7,2)

DEPTNO NUMBER(2)

TMPCOL VARCHAR2(10)

由以上测试可以看到,dml,ddl操作均可顺利传输并应用于target端,streams单表单向复制完成~~

oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息