stream簡單配置之capture,propagation,apply應用(四)

atlantisholic發表於2011-06-15

一、要求

1初始化引數的修改

Ø global_names必須設定為true,global_name=db_name+db_domain。

Ø job_queue_processes必須>2

Ø compatible,必須高於10.2.0,並且target中該引數值不能低於source database.

Ø streams_pool_size,指定適當的大小,當然如果設定了sga_target,該引數也可由系統自動調節

2source database必須啟用歸檔模式

3雙機互相建立database link

 

二、建立使用者及搭建環境

    這裡設定我們的source資料庫是jssweb,target資料庫是jssstr,資料庫版本10201,兩機準備工作均已做好(主要指上面說的那幾條)

1、一個一個來吧,首先自然是source
SQL> conn / as sysdba
已連線。
SQL> set sqlprompt "JSSWEB> "

--建立一個專用於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 fromdual@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 fromdual@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 *fromscott.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單表單向複製完成~~

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23071790/viewspace-698000/,如需轉載,請註明出處,否則將追究法律責任。

相關文章