一步一步學Streams(13) 第二部分 實踐之建立全庫複製(3)測試

junsansi發表於2009-03-02

三、 測試複製環境:

1、 DDL 操作

  源端操作:

    JSSWEB> create tablespace jsstbs datafile ¨/data/oradata/jssweb/jsstbs01.dbf¨ size 200m;

    Tablespace created.

    JSSWEB> create user jss identified by jss default tablespace jsstbs quota unlimited on jsstbs;

    User created.

    JSSWEB> grant connect,resource to jss;

    Grant succeeded.

    JSSWEB> alter system switch logfile;

    System altered.

  轉到目標端查詢:

    JSSSTR> select username from dba_users where username=¨JSS¨;

    USERNAME

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

    JSS

    JSSSTR> select name from v$tablespace;

    NAME

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

    SYSTEM

    TEMP

    UNDOTBS1

    SYSAUX

    USERS

    STRMTBS

    JSSTBS

    已選擇7行。

    JSSSTR> select name from v$datafile;

    NAME

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

    /data/oradata/jssstr/system01.dbf

    /data/oradata/jssstr/undotbs01.dbf

    /data/oradata/jssstr/sysaux01.dbf

    /data/oradata/jssstr/users01.dbf

    /data/oradata/jssstr/strmtbs01.ora

    /data/oradata/jssweb/jsstbs01.dbf

    已選擇6行。

  目標端操作:

    JSSSTR > conn jss/jss

    已連線。

    JSSSTR> create table t as select * from all_objects where rownum<10;

    表已建立。

    JSSSTR> conn / as sysdba

    已連線。

    JSSSTR> alter system switch logfile;

    系統已更改。

  源端檢視:

    JSSWEB> conn jss/jss

    Connected.

    JSSWEB> select count(0) from t;

    COUNT(0)

    ----------

    9

  可以看到,使用者/表空間/表均已成功建立,雙向基本同步成功,不過如果你足夠細心會發現這裡頭有一個問題,資料檔案路徑的問題,這個問題暫時擱下,後面再介紹解決方案,接著測試DML操作的同步情況。

2、 DML 操作

    JSSWEB> delete t;

    9 rows deleted.

    JSSWEB> commit;

    Commit complete.

    JSSWEB> conn / as sysdba

    Connected.

    JSSWEB> alter system switch logfile;

    System altered.

    JSSSTR> select count(0) from jss.t;

    COUNT(0)

    ----------

    0

    DML 同步成功。

3、 資料檔案路徑的匹配

  在第一步測試ddl建立表空間時,我們指定了資料檔案路徑,某些情況下,可能源端和目標端的路徑並不相同(甚至源端路徑在目標端不存在),如上例中我們的環境就是這樣,因此我們希望源端路徑到目標端後能夠做適當轉換,以避免出錯。Streams不支援dataguard中使用的db_file_convert之類的引數,但是streams中提供了更強大的DDL handler,這裡我們就通過DDL handler來解決這個問題。

  首先先將路徑不正常的表空間刪除(當然也可以不刪而是通過命令修改,這裡為了演示更加清晰首先刪除該表空間,建立好DDL handler後再重建):

  雙向複製,兩邊都是源,因此哪邊執行刪除都可以:

    JSSSTR> drop tablespace jsstbs including contents and datafiles;

    表空間已刪除。

    JSSSTR> select name from v$datafile;

    NAME

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

    /data/oradata/jssstr/system01.dbf

    /data/oradata/jssstr/undotbs01.dbf

    /data/oradata/jssstr/sysaux01.dbf

    /data/oradata/jssstr/users01.dbf

    /data/oradata/jssstr/strmtbs01.ora

    JSSSTR> alter system switch logfile;

    系統已更改。

  到目標端看一看:

    JSSWEB> select name from v$datafile;

    NAME

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

    /data/oradata/jssweb/system01.dbf

    /data/oradata/jssweb/undotbs01.dbf

    /data/oradata/jssweb/sysaux01.dbf

    /data/oradata/jssweb/users01.dbf

    /data/oradata/jssweb/strmtbs01.ora

  OK ,成功刪除。

  下面演示建立DDL handler解決源與目標端路徑不同的問題,以我們這裡遇到的問題為例,我們希望將/data/oradata/jssweb轉換為/data/oradata/jssstr,那麼,可以通過如下操作:

  連線到strmadmin使用者,建立一個處理過程:

    JSSSTR> conn strmadmin/strmadmin

    已連線。

    JSSSTR> create or replace procedure file_convert (in_any IN ANYDATA) authid current_user is

    2 ddl_lcr SYS.LCR$_DDL_RECORD;

    3 ddl_text CLOB;

    4 rc PLS_INTEGER;

    5 begin

    6 rc := in_any.GETOBJECT(ddl_lcr);

    7 DBMS_LOB.CREATETEMPORARY(ddl_text, true);

    8 ddl_lcr.GET_DDL_TEXT(ddl_text);

    9 ddl_text := replace(ddl_text,¨/data/oradata/jssweb¨,¨/data/oradata/jssstr¨);

    10 execute immediate to_char(ddl_text);

    11 DBMS_LOB.FREETEMPORARY(ddl_text);

    12 end;

    13 /

    過程已建立。

  提示:通過這種方式也可以很容易記錄下所有操作過的ddl語句。

  設定ddl handler:

    JSSSTR> select apply_name from dba_apply;

    APPLY_NAME

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

    APPLY$_JSSWEB_31

    JSSSTR> exec DBMS_APPLY_ADM.ALTER_APPLY(apply_name => ¨APPLY$_JSSWEB_31¨,ddl_handler => ¨strmadmin.file_convert¨);

    PL/SQL 過程已成功完成。

  查詢dba_apply字典:

    JSSSTR> select apply_name,ddl_handler,status from dba_apply ;

    APPLY_NAME DDL_HANDLER STATUS

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

    APPLY$_JSSWEB_31 "STRMADMIN"."FILE_CONVERT" ENABLED

  驗證一下,源端重新建立表空間:

    JSSWEB> create tablespace jsstbs datafile ¨/data/oradata/jssweb/jsstbs01.dbf¨ size 200m;

    Tablespace created.

    JSSWEB> alter system switch logfile;

    System altered.

  目標端檢視錶空間建立情況:

    JSSSTR> select name from v$datafile;

    NAME

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

    /data/oradata/jssstr/system01.dbf

    /data/oradata/jssstr/undotbs01.dbf

    /data/oradata/jssstr/sysaux01.dbf

    /data/oradata/jssstr/users01.dbf

    /data/oradata/jssstr/strmtbs01.ora

    /data/oradata/jssstr/jsstbs01.dbf

    已選擇6行。

  路徑轉換成功,不過注意喲,我們這裡是雙向複製,因此從完整性的角度說還應該在jssweb資料庫中也建立一個ddl hander,以替換/data/oradata/jssstr為/data/oradata/jssweb,因操作步驟與此相同,這裡就不演示了,塗廢筆墨,非我所好。

  至此整庫的複製環境搭建完成!

======================================

一步一步學Streams(12) 第二部分 實踐之建立全庫複製(2)執行建立

一步一步學Streams(11) 第二部分 實踐之建立全庫複製(1)準備工作

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

相關文章