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

junsansi發表於2009-02-26

二、進入建立環節,操作如下:

1、 建立streams管理員帳號

  建議為streams的管理帳號建立獨立表空間,方便管理的維護。

    JSSWEB> create tablespace strmtbs datafile ¨/data/oradata/jssweb/strmtbs01.ora¨ size 300m;

    Tablespace created.

    JSSWEB> create user strmadmin identified by strmadmin default tablespace strmtbs quota unlimited on strmtbs;

    User created.

    JSSWEB> grant dba to strmadmin;

    Grant succeeded.

    JSSWEB> revoke unlimited tablespace from strmadmin;

    Revoke succeeded.

2、 建立資料庫鏈

    JSSWEB> conn strmadmin/strmadmin

    Connected.

    JSSWEB> create database link jssstr connect to strmadmin identified by strmadmin using ¨jssstr _172.25.13.231 ¨;

    Database link created.

  提示:此時jssstr確實尚不存在,沒有關係,PRE_INSTANTIATION_SETUP過程在執行時並不會驗證資料庫的有效性,因此仍然建立。

3、 源端執行初始化過程

    JSSWEB> conn strmadmin/strmadmin

    Connected.

    JSSWEB > DECLARE

    2 empty_tbs DBMS_STREAMS_TABLESPACE_ADM.TABLESPACE_SET;

    3 BEGIN

    4 DBMS_STREAMS_ADM.PRE_INSTANTIATION_SETUP(

    5 maintain_mode => ¨GLOBAL¨,

    6 tablespace_names => empty_tbs,

    7 source_database => ¨jssweb.jss.cn¨,

    8 destination_database => ¨jssstr.jss.cn¨,

    9 perform_actions => true,

    10 bi_directional => true,

    11 include_ddl => true,

    12 start_processes => true,

    13 exclude_schemas => ¨strmadmin¨,

    14 exclude_flags => DBMS_STREAMS_ADM.EXCLUDE_FLAGS_ FULL +

    15 DBMS_STREAMS_ADM.EXCLUDE_FLAGS_DML +

    16 DBMS_STREAMS_ADM.EXCLUDE_FLAGS_DDL);

    17 END;

    18 /

    PL/SQL procedure successfully completed.

  下面逐條說明PRE_INSTANTIATION_SETUP各個引數 :

  • maintain_mode 只有兩個值:GLOBAL,表示資料庫級的複製;TRANSPORTABLE TABLESPACES,表示表空間級的複製,需要同時指定tablespace_names引數,表空間可以是多個,後面會有示例演示通過PRE_INSTANTIATION_SETUP/POST_INSTANTIATION_SETUP建立表空間級的複製環境。
  • tablespace_names :要複製的表空間,此處為資料庫級的複製,因此此引數為空,不過該引數不能直接指定為null,因為該引數型別為DBMS_STREAMS_TABLESPACE_ADM.TABLESPACE_SET,因此我們在執行過程前先declare了一個empty_tbs的變數。
  • source_datebase :連線到源端資料庫的資料庫鏈 。
  • destination_database :連線到目標端資料庫的資料庫鏈 。
  • perform_actions :如果為true,則過程直接執行。如果為false,則過程並不直接生成複製環境,而是建立複製環境的配置指令碼,由dba手動執行(或修改編輯後執行),因此必須同時設定script_name和script_directory_object兩引數,指定指令碼輸出路徑和指令碼檔名,不然過程執行將直接報錯。
  • bi_directional :true時表示啟用雙向複製。false表示源庫向目錄庫單向複製。
  • include_ddl :是否同步ddl語句 。
  • start_processes :是否啟用捕獲和應用程式 。
  • exclude_schemas :指定不包含在複製環境中的schemas。*表示全不包括,null表示全部包括(一個bu字,意義千差萬別,漢字太奇妙啦),注意,由於源端的捕獲程式不會捕獲SYS/SYSTEM/CTXSYS這三個schema,因此即使此處指定null,這三個schema也不會被同步。另外,此引數僅在MAINTAIN_MODE=>¨GLOBAL¨時有效。
  • exclude_flags : 這個要好好說說,這個選項是與exclude_schemas組合使用,同時由於該引數值具有多個組合屬性,因此設定時也特別需要注意。

有如下可選值:

  • DBMS_STREAMS_ADM.EXCLUDE_FLAGS_FULL :排除指定schemas中所有物件操作。
  • DBMS_STREAMS_ADM.EXCLUDE_FLAGS_UNSUPPORTED :排除指定schemas中不支援的物件操作。
  • 上述兩值僅能同時選一個,如果兩個同時選擇在配置時會丟擲異常。同時還有下列兩個附加選項:
  • DBMS_STREAMS_ADM.EXCLUDE_FLAGS_DML :排除對不支援物件的DML操作。
  • DBMS_STREAMS_ADM.EXCLUDE_FLAGS_DDL :排除對不支援物件的DDL操作。

上述四個屬性值可以通過"+"號連線來達到同時支援的目的。

比如,對於exclude_schemas引數中指定的schemas物件,複製其DML操作但不復制DDL操作,則設定exclude_flags引數值如下可滿足要求:

    DBMS_STREAMS_ADM.EXCLUDE_FLAGS_FULL +

    DBMS_STREAMS_ADM.EXCLUDE_FLAGS_DDL

又比如,對於exclude_schemas引數中指定的schemas不支援的物件,即不復制其DDL操作也不復制其DML操作,則設定如下即可:

    DBMS_STREAMS_ADM.EXCLUDE_FLAGS_UNSUPPORTED +

    DBMS_STREAMS_ADM.EXCLUDE_FLAGS_DML +

    DBMS_STREAMS_ADM.EXCLUDE_FLAGS_DDL

提示:這個引數僅在maintail_mode設定為GLOBAL,並且exclude_schemas引數設定為非空值是有效,其它情況下即使設定也會自動忽略該引數值。

  在本例中我們的設定相當於不復制strmadmin下的所有物件,也不同步對該schema下物件的操作。

4、 源端建立 rman 的備份

    [oracle@yans1 ~]$ rman target /

    Recovery Manager: Release 10.2.0.3.0 - Production on 星期三 11月 26 11:17:37 2008

    Copyright (c) 1982, 2005, Oracle. All rights reserved.

    connected to target database: JSSWEB (DBID=3439008274)

    RMAN> run{

    2> allocate channel c1 device type disk format ¨/data/backup/jssweb/%U¨;

    3> backup database plus archivelog delete input;

    4> }

    using target database control file instead of recovery catalog

    allocated channel: c1

    channel c1: sid=126 devtype=DISK

    Starting backup at 26-11 月-08

    current log archived

    ......................

    ...........................

    ..................................

    archive log filename=/data/oradata/jssweb/archivelog/1_41_671128850.dbf thread=1 sequence=41

    Finished backup at 26-11 月-08

    released channel: c1

  然後馬上檢視一下當前系統的scn,並且歸檔當前的redo

    JSSWEB> select dbms_flashback.get_system_change_number from dual;

    GET_SYSTEM_CHANGE_NUMBER

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

    192553

    JSSWEB> alter system archive log current;

    System altered.

5、 複製備份檔案,及剛剛產生的歸檔至目錄端

  方式很多,過程不詳述 。注意保持目錄相同(如果不相同,需要通過rman catalog命令等重新註冊備份檔案,總之就是要保證rman duplicate執行時,要能找的到備份集和需要讀取的歸檔檔案)。

6、 執行Rman duplicate 命令複製資料庫

  注意此處set until scn為前文操作中獲取的scn。

    [oracle@yans1 ~]$ rman target / auxiliary sys/tfad04@jssstr

    Recovery Manager: Release 10.2.0.3.0 - Production on 星期三 11月 26 14:32:57 2008

    Copyright (c) 1982, 2005, Oracle. All rights reserved.

    connected to target database: JSSWEB (DBID=3439008274)

    connected to auxiliary database: JSSSTR (not mounted)

    RMAN> run{

    2> set until scn 192553;

    3> duplicate target database to jssstr

    4> DB_FILE_NAME_CONVERT=(jssweb,jssstr) LOGFILE

    5> ¨/data/oradata/jssstr/redo01.log¨ SIZE 50M,

    6> ¨/data/oradata/jssstr/redo02.log¨ SIZE 50M,

    7> ¨/data/oradata/jssstr/redo03.log¨ SIZE 50M

    8> open restricted;

    9> }

    executing command: SET until clause

    using target database control file instead of recovery catalog

    Starting Duplicate Db at 26-11 月-08

    allocated channel: ORA_AUX_DISK_1

    channel ORA_AUX_DISK_1: sid=155 devtype=DISK

    contents of Memory Script.

    {

    set until scn 192553 ;

    set newname for datafile 1 to

    "/data/oradata/jssstr/system01.dbf";

    set newname for datafile 2 to

    "/data/oradata/jssstr/undotbs01.dbf";

    set newname for datafile 3 to

    "/data/oradata/jssstr/sysaux01.dbf";

    set newname for datafile 4 to

    "/data/oradata/jssstr/users01.dbf";

    set newname for datafile 5 to

    "/data/oradata/jssstr/strmtbs01.ora";

    restore

    check readonly

    clone database

    ;

    }

    executing Memory Script.

    ...............

    ...................

    .........................

    contents of Memory Script.

    {

    sql clone ¨alter system enable restricted session¨;

    Alter clone database open resetlogs;

    }

    executing Memory Script.

    sql statement: alter system enable restricted session

    database opened

    Finished Duplicate Db at 26-11 月-08

7、 連線到目標端,檢視當前GLOBAL_NAME

    JSSSTR> select * from global_name;

    GLOBAL_NAME

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

    JSSWEB.JSS.CN

  如果不等於db_name+db_domain,則通過alter database rename命令修改:

    JSSSTR> alter database rename global_name to jssstr.jss.cn;

    資料庫已更改。

8、 建立目標端到源端的資料庫鏈

    JSSSTR> conn strmadmin/strmadmin

    已連線。

    JSSSTR> create database link jssweb connect to strmadmin identified by strmadmin using ¨jssweb _172.25.13.229 ¨;

    資料庫連結已建立。

  不過由於jssstr資料庫是由jssweb複製過來的,因此strmadmin使用者下也存在一個jssstr.jss.cn的dblink,如果看其不爽可以將它刪除,不過直接刪除是不行的,肯定會報ORA-02082錯誤,因為不能刪除與global_name同名的dblink。如果確實想刪除該dblink,方法有二:

A>. 先修改global_name,再刪除dblink

    JSSSTR> alter database rename global_name to test.jss.cn;

    資料庫已更改。

    JSSSTR> drop database link jssstr.jss.cn;

    資料庫連結已刪除。

    JSSSTR> alter database rename global_name to jssstr.jss.cn;

    資料庫已更改。

B>. 直接刪除字典表

  注:本方法由yangtingkun老大提供,號稱其對drop database link做過精確的trace分析,確認該項操作實際就是delete sys.link$字典。

    JSSSTR> conn / as sysdba

    已連線。

    JSSSTR> delete link$ where name=¨JSSSTR.JSS.CN¨;

    已刪除 1 行。

    JSSSTR> commit;

    提交完成。

9、 源端執行POST_INSTANTIATION_SETUP過程

    JSSWEB> DECLARE

    2 empty_tbs DBMS_STREAMS_TABLESPACE_ADM.TABLESPACE_SET;

    3 BEGIN

    4 DBMS_STREAMS_ADM.POST_INSTANTIATION_SETUP(

    5 maintain_mode => ¨GLOBAL¨,

    6 tablespace_names => empty_tbs,

    7 source_database => ¨jssweb.jss.cn¨,

    8 destination_database => ¨jssstr.jss.cn¨,

    9 perform_actions => true,

    10 bi_directional => true,

    11 include_ddl => true,

    12 start_processes => true,

    13 instantiation_scn => 192552 ,

    14 exclude_schemas => ¨strmadmin¨,

    15 exclude_flags => DBMS_STREAMS_ADM.EXCLUDE_FLAGS_ FULL +

    16 DBMS_STREAMS_ADM.EXCLUDE_FLAGS_DML +

    17 DBMS_STREAMS_ADM.EXCLUDE_FLAGS_DDL);

    18 END;

    19 /

    PL/SQL procedure successfully completed.

  如果沒報錯,至此,雙向同步的streams整庫複製環境就算完成了,最後,在目標端執行,取消受限連線:

    JSSSTR> conn / as sysdba

    已連線。

    JSSSTR> ALTER SYSTEM DISABLE RESTRICTED SESSION;

    系統已更改。

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

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

一步一步學Streams(10) 第二部分 實踐之準備工作(2)初始化環境

一步一步學Streams(9) 第二部分 實踐之準備工作(1)明確需求

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

相關文章