<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-144  評(píng)論-80  文章-1  trackbacks-0

    ORACLE的高級(jí)復(fù)制實(shí)現(xiàn)內(nèi)外網(wǎng)數(shù)據(jù)同步

     

    陳光 holen@263.net 2003.10

     

    本文簡(jiǎn)要介紹了ORACLE的高級(jí)復(fù)制功能,并通過一個(gè)實(shí)際項(xiàng)目,討論了在內(nèi)外網(wǎng)的兩級(jí)DB中如何采用高級(jí)復(fù)制達(dá)到內(nèi)外網(wǎng)的數(shù)據(jù)統(tǒng)一,最后給出配置腳本供大家參考。

     

    1、基本概念

     

    ORACLE

    ORACLE是以高級(jí)結(jié)構(gòu)化查詢語(yǔ)言(SQL)為基礎(chǔ)的大型關(guān)系數(shù)據(jù)庫(kù),通俗地講它是用方便邏輯管理的語(yǔ)言操縱大量有規(guī)律數(shù)據(jù)的集合。是客戶/服務(wù)器(CLIENT/SERVER)體系結(jié)構(gòu)的數(shù)據(jù)庫(kù)之一。

     

    高級(jí)復(fù)制

    什么是復(fù)制?簡(jiǎn)單地說(shuō)復(fù)制就是在由兩個(gè)或者多個(gè)數(shù)據(jù)庫(kù)系統(tǒng)構(gòu)成的一個(gè)分布式數(shù)據(jù)庫(kù)環(huán)境中拷貝數(shù)據(jù)的過程。

    高級(jí)復(fù)制,是在組成分布式數(shù)據(jù)庫(kù)系統(tǒng)的多個(gè)數(shù)據(jù)庫(kù)中復(fù)制和維護(hù)數(shù)據(jù)庫(kù)對(duì)象的過程。 Oracle 高級(jí)復(fù)制允許應(yīng)用程序更新數(shù)據(jù)庫(kù)的任何副本,并將這些更改自動(dòng)傳遞到其他數(shù)據(jù)庫(kù),同時(shí)確保全局事務(wù)處理的一致性和數(shù)據(jù)完整性。

    同步復(fù)制,復(fù)制數(shù)據(jù)在任何時(shí)間在任何復(fù)制節(jié)點(diǎn)均保持一致。如果復(fù)制環(huán)境中的任何一個(gè)節(jié)點(diǎn)的復(fù)制數(shù)據(jù)發(fā)生了更新操作,這種變化會(huì)立刻反映到其他所有的復(fù)制節(jié)點(diǎn)。這種技術(shù)適用于那些對(duì)于實(shí)時(shí)性要求較高的商業(yè)應(yīng)用中。

    異步復(fù)制,所有復(fù)制節(jié)點(diǎn)的數(shù)據(jù)在一定時(shí)間內(nèi)是不同步的。如果復(fù)制環(huán)境中的其中的一個(gè)節(jié)點(diǎn)的復(fù)制數(shù)據(jù)發(fā)生了更新操作,這種改變將在不同的事務(wù)中被傳播和應(yīng)用到其他所有復(fù)制節(jié)點(diǎn)。這些不同的事務(wù)間可以間隔幾秒,幾分種,幾小時(shí),也可以是幾天之后。復(fù)制節(jié)點(diǎn)之間的數(shù)據(jù)臨時(shí)是不同步的,但傳播最終將保證所有復(fù)制節(jié)點(diǎn)間的數(shù)據(jù)一致。

     

    2、項(xiàng)目情況

          

    需求描述

           這是一個(gè)內(nèi)外網(wǎng)結(jié)構(gòu)的審批系統(tǒng)。

    外網(wǎng)有一個(gè)WEB+APPSERVER),一個(gè)DBORACLE9.2,雙網(wǎng)卡),負(fù)責(zé)接收申報(bào)和反饋審批結(jié)果。

    內(nèi)網(wǎng)有一個(gè)WEB+APPSERVER),一個(gè)DBORACLE9.2,雙網(wǎng)卡),負(fù)責(zé)接收申報(bào)和反饋審批結(jié)果,以及通過審批流程處理來(lái)自外網(wǎng)的審批申報(bào)。

    由上可知,內(nèi)網(wǎng)功能包括外網(wǎng)功能,不過外網(wǎng)申報(bào)需要CA認(rèn)證,內(nèi)網(wǎng)則不需要。

    根據(jù)國(guó)家保密有關(guān)規(guī)定,政務(wù)系統(tǒng)的內(nèi)外網(wǎng)必須物理隔絕,所以外網(wǎng)接收到的申報(bào)并不能馬上反應(yīng)到內(nèi)網(wǎng),同理,內(nèi)網(wǎng)的處理結(jié)果也不能迅速反饋到外網(wǎng)。

     

    技術(shù)選擇`

    我們選擇ORACLE異步手工復(fù)制,復(fù)制主要完如下功能:

    1.  把外網(wǎng)新申報(bào)數(shù)據(jù)復(fù)制到內(nèi)網(wǎng);

    2.  把內(nèi)網(wǎng)對(duì)申報(bào)的處理結(jié)果反饋到外網(wǎng)。

     

    操作實(shí)現(xiàn)

    因?yàn)檎9ぷ鲿r(shí)間,內(nèi)外網(wǎng)均不能停頓,而內(nèi)外網(wǎng)又不能物理連通。于是設(shè)定在每天晚上18:0018:15(或其它時(shí)段)為維護(hù)時(shí)段,該時(shí)段內(nèi)外網(wǎng)均停止作業(yè),由系統(tǒng)管理員把與內(nèi)外網(wǎng)DB相連的所有網(wǎng)線均斷開,用一根直連網(wǎng)線把兩臺(tái)DB連接,通過ORACLE提供的操作界面,在外網(wǎng)端手工刷新記錄。

     

     

    3、具體實(shí)現(xiàn)步驟

     

    以下是腳本中用到的技術(shù)參數(shù),內(nèi)外網(wǎng)表結(jié)構(gòu)相同,且都有主鍵。

     

     

    內(nèi)網(wǎng)

    外網(wǎng)

    IP

    192.168.0.50

    192.168.0.100

    SID

    ORANEI

    ORAWAI

    LAWTABLE

    REGISTER

    USERINFO

    ……

    68張表

    LAWTABLE

    REGISTER

    2張表

    登錄名/密碼

    HOLEN/HOLEN

    HOLEN/HOLEN

     

    以下是我們到客戶處安裝所用的SQL腳本

     

    第一步:配置內(nèi)網(wǎng),即MASTER

    --版本:2.0

    --修訂者:陳光 holen@263.net

    --時(shí)間:2003-6-8 15:30                   

    --內(nèi)網(wǎng)作為MASTER   

    --創(chuàng)建內(nèi)網(wǎng)用戶HOLEN

     

    CONN SYSTEM/PASSWORD@ORANEI

     

    CREATE USER "HOLEN"  PROFILE "DEFAULT" IDENTIFIED BY "HOLEN" ;

    GRANT "CONNECT" TO "HOLEN";

    GRANT "DBA" TO "HOLEN";

    GRANT "RESOURCE" TO "HOLEN";

    --導(dǎo)入內(nèi)網(wǎng)數(shù)據(jù)庫(kù)備份,dos下到入完成(表LAWTABLE,REGISTER及其他表)

     

    第二步:配置內(nèi)網(wǎng),即MASTER端(續(xù))

    --需要復(fù)制(同步)的表為HOLEN用戶下的LAWTABLE,REGISTER

     

    --創(chuàng)建repadmin用戶管理復(fù)制環(huán)境

    CREATE USER REPADMIN IDENTIFIED BY REPADMIN;

    ALTER  USER REPADMIN DEFAULT TABLESPACE USERS;

    ALTER  USER REPADMIN TEMPORARY TABLESPACE TEMP;

    GRANT connect, resource TO REPADMIN;

     

    --授予repadmin用戶權(quán)限可以管理當(dāng)前站點(diǎn)中任何主體組

    EXECUTE dbms_repcat_admin.grant_admin_any_schema('REPADMIN');

     

    --授予repadmin用戶權(quán)限可以為任何表創(chuàng)建snapshot logs

    GRANT comment any table TO REPADMIN;

    GRANT lock any table TO REPADMIN;

     

    --指定repadmin用戶為propagator,并授予執(zhí)行任何procedure的權(quán)限

    EXECUTE dbms_defer_sys.register_propagator('REPADMIN');

    GRANT execute any procedure TO REPADMIN;

     

    --分配proxy snapshot administration權(quán)限給repadmin,list_of_gnamesnull,意味著可以管理所有對(duì)象組

    BEGIN

      dbms_repcat_admin.register_user_repgroup(

      username =>       'repadmin',

      privilege_type => 'proxy_snapadmin',

      list_of_gnames =>  NULL);

    END;

    /

     

    --分配'receiver'權(quán)限給repadmin

    BEGIN

          dbms_repcat_admin.register_user_repgroup(

          username =>       'repadmin',

          privilege_type => 'receiver',

          list_of_gnames =>  NULL);

    END;

    /

     

    GRANT select any table TO repadmin;

     

    --ORANEI上建立主體組,主體組名為HOLEN_MASTER,并往主體組中加入一個(gè)表

    --建立復(fù)制主體組

    BEGIN

       DBMS_REPCAT.CREATE_MASTER_REPGROUP(

       gname => '"HOLEN_MASTER"',

       qualifier => '',

       group_comment => '');

    END;

    /

     

    CONNECT REPADMIN/REPADMIN;

     

     

    --向復(fù)制組中加入表對(duì)象LAWTABLE

    BEGIN

       DBMS_REPCAT.CREATE_MASTER_REPOBJECT(

       gname => '"HOLEN_MASTER"',

       type => 'TABLE',

       oname => '"LAWTABLE"',

       sname => '"HOLEN"',

       copy_rows => TRUE,

       use_existing_object => TRUE);

    END;

    /

     

    --建立相應(yīng)的快照日志

    CREATE SNAPSHOT LOG

         ON "HOLEN"."LAWTABLE"

    TABLESPACE "SYSTEM"

    WITH PRIMARY KEY

    EXCLUDING NEW VALUES;

     

    --生成復(fù)制支持

    BEGIN  

       DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT(

       sname => '"HOLEN"',

       oname => '"LAWTABLE"',

       type => 'TABLE',

       min_communication => TRUE,

       generate_80_compatible => FALSE);

    END;

    /

     

    --向復(fù)制組中加入表對(duì)象REGISTER

    BEGIN

       DBMS_REPCAT.CREATE_MASTER_REPOBJECT(

       gname => '"HOLEN_MASTER"',

       type => 'TABLE',

       oname => '"REGISTER"',

       sname => '"HOLEN"',

       copy_rows => TRUE,

       use_existing_object => TRUE);

    END;

    /

     

    CREATE SNAPSHOT LOG

         ON "HOLEN"."REGISTER"

    TABLESPACE "SYSTEM"

    WITH PRIMARY KEY

    EXCLUDING NEW VALUES;

     

    BEGIN  

       DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT(

       sname => '"HOLEN"',

       oname => '"REGISTER"',

       type => 'TABLE',

       min_communication => TRUE,

       generate_80_compatible => FALSE);

    END;

    /

     

    --MASTER端配置完畢

     

    第三步:配置外網(wǎng),即SNAPSHOT

    --外網(wǎng)作為SNAPSHOT   

    --創(chuàng)建外網(wǎng)用戶HOLEN

     

    CONN SYSTEM/PASSWORD@ORAWAI

     

    --創(chuàng)建普通用戶

    CREATE USER "HOLEN"  PROFILE "DEFAULT" IDENTIFIED BY "HOLEN";  

    GRANT "CONNECT" TO "HOLEN";

    GRANT "DBA" TO "HOLEN";

    GRANT "RESOURCE" TO "HOLEN";

     

    --創(chuàng)建repadmin用戶管理快照端復(fù)制環(huán)境

    CREATE USER REPADMIN IDENTIFIED BY REPADMIN;

    ALTER  USER REPADMIN DEFAULT TABLESPACE USERS;

    ALTER  USER REPADMIN TEMPORARY TABLESPACE TEMP;

    GRANT connect, resource TO REPADMIN;

     

    --授予repadmin用戶權(quán)限可以管理當(dāng)前站點(diǎn)中任何主體組

    EXECUTE dbms_repcat_admin.grant_admin_any_schema('REPADMIN');

     

    --授予repadmin用戶權(quán)限可以為任何表創(chuàng)建snapshot logs

    GRANT comment any table TO REPADMIN;

    GRANT lock any table TO REPADMIN;

     

    --指定repadmin用戶為propagator,并授予執(zhí)行任何procedure的權(quán)限

    EXECUTE dbms_defer_sys.register_propagator('REPADMIN');

    GRANT execute any procedure TO REPADMIN;

     

    --授予repadmin用戶可以創(chuàng)建快照

    GRANT create any snapshot TO REPADMIN;

    GRANT alter any snapshot TO REPADMIN;

     

    --在外網(wǎng)建立與內(nèi)網(wǎng)的鏈接

    --在外網(wǎng)端需要把ORANEI添加到樹

    CREATE PUBLIC DATABASE LINK ORANEI CONNECT TO REPADMIN IDENTIFIED BY REPADMIN USING ' ORANEI ';

     

    --在外網(wǎng)建立刷新組 HOLEN_REFRESH

    BEGIN

       DBMS_REFRESH.MAKE(

       name => '"HOLEN"."HOLEN_REFRESH"',

       list => '',

       next_date => SYSDATE,

       interval => '/*1:Mins*/ sysdate + 1/(60*24)',

       implicit_destroy => FALSE,

       lax => FALSE,

       job => 0,

       rollback_seg => NULL,

       push_deferred_rpc => TRUE,

       refresh_after_errors => TRUE,

       purge_option => NULL,

       parallelism => NULL,

       heap_size => NULL);

    END;

    /

     

    --在外網(wǎng)建立快照組

    BEGIN

       DBMS_REPCAT.CREATE_SNAPSHOT_REPGROUP(

       gname => '"HOLEN_MASTER"',

       master => 'ORANEI.US.ORACLE.COM',

       propagation_mode => 'ASYNCHRONOUS');

    END;

    /

     

    --建立快照,快照要在表所屬的用戶下建立,本例要先用HOLEN用戶登陸

    CONNECT HOLEN/HOLEN;

     

    --建立快照LAWTABLE

    CREATE SNAPSHOT "HOLEN"."LAWTABLE" 

    REFRESH FAST FOR UPDATE

    AS SELECT * FROM "HOLEN"."LAWTABLE"@ ORANEI.US.ORACLE.COM C

    /

     

    --將快照加入刷新組

    BEGIN  

      DBMS_REFRESH.ADD(

      name => '"HOLEN"."HOLEN_REFRESH"',

      list => '"HOLEN"."LAWTABLE"',

      lax => TRUE);

    END;

    /

     

    --將快照加入快照組

    BEGIN

       DBMS_REPCAT.CREATE_SNAPSHOT_REPOBJECT(

       gname => '"HOLEN_MASTER"',

       sname => '"HOLEN"',

       oname => '"LAWTABLE"',

       type => 'SNAPSHOT',

       min_communication => FALSE);

    END;

    /

     

    --建立快照REGISTER

    CREATE SNAPSHOT "HOLEN"."REGISTER" 

    REFRESH FAST FOR UPDATE

    AS SELECT * FROM "HOLEN"."REGISTER"@ ORANEI.US.ORACLE.COM C

    /

     

    --將快照加入刷新組

    BEGIN  

      DBMS_REFRESH.ADD(

      name => '"HOLEN"."HOLEN_REFRESH"',

      list => '"HOLEN"."REGISTER"',

      lax => TRUE);

    END;

    /

     

    --將快照加入快照組

    BEGIN

       DBMS_REPCAT.CREATE_SNAPSHOT_REPOBJECT(

       gname => '"HOLEN_MASTER"',

       sname => '"HOLEN"',

       oname => '"REGISTER"',

       type => 'SNAPSHOT',

       min_communication => FALSE);

    END;

    /

     

    --外網(wǎng)端(SNAPSHOT)配置完畢

     

    第四步:配置內(nèi)網(wǎng)

    --當(dāng)外網(wǎng)配置完成后,在內(nèi)網(wǎng)執(zhí)行如下語(yǔ)句

     

    BEGIN   

       DBMS_REPCAT.RESUME_MASTER_ACTIVITY(

       gname => '"HOLEN_MASTER"');

    END;

    /

     

     

    4、后記

     

    ORACLE的高級(jí)復(fù)制功能非常強(qiáng)大,能實(shí)現(xiàn)多點(diǎn)間的數(shù)據(jù)同步、異步復(fù)制。

    內(nèi)外網(wǎng)結(jié)構(gòu)的報(bào)送、審批、備案等兩(多)級(jí)系統(tǒng)日益流行,若內(nèi)外DB為同類型商業(yè)數(shù)據(jù)庫(kù),一般數(shù)據(jù)庫(kù)本身都提供復(fù)制功能,若內(nèi)外網(wǎng)為不同類型的數(shù)據(jù)庫(kù),如內(nèi)網(wǎng)為SQLSERVER,外網(wǎng)為ORACLE,則一般使用“同步機(jī)”中間件,在程序中調(diào)用即可。

    感謝李鑫為我提供技術(shù)解答!

     

    5、關(guān)于作者

     

    陳光,J2EE項(xiàng)目經(jīng)理,熟悉EJBXML,致力Aapche JakartaAapche XML項(xiàng)目的應(yīng)用與推廣,可通過holen@263.net與作者聯(lián)系。

     

    posted on 2005-03-10 15:32 小力力力 閱讀(383) 評(píng)論(0)  編輯  收藏 所屬分類: ORACLE
    主站蜘蛛池模板: 7777久久亚洲中文字幕| 亚洲精品456播放| 亚洲精品亚洲人成在线麻豆| 国产日韩在线视频免费播放| 亚洲精品乱码久久久久久蜜桃| 杨幂最新免费特级毛片| 免费在线观看黄网| 亚洲人成网站在线观看播放动漫| 久久久精品免费视频| 西西人体44rt高清亚洲| 亚洲人成人77777在线播放| 91黑丝国产线观看免费| 亚洲a∨无码男人的天堂| 永久免费av无码网站韩国毛片| 亚洲精品天堂在线观看| 日本高清免费中文字幕不卡| 美国毛片亚洲社区在线观看| 亚洲av午夜成人片精品电影| 亚洲国产成人九九综合| 无码人妻一区二区三区免费| 亚洲日韩AV无码一区二区三区人| 国产一区二区三区免费视频| 亚洲国产成人无码av在线播放 | 九九免费观看全部免费视频| 最好看最新的中文字幕免费| 亚洲春黄在线观看| 在线观看片免费人成视频无码| 亚洲AV区无码字幕中文色| 免费看黄视频网站| 黄网站色视频免费观看45分钟| 91在线视频免费播放| 国产成人亚洲精品无码AV大片| 国产亚洲精品免费视频播放| 免费看又黄又爽又猛的视频软件| 亚洲熟妇无码八AV在线播放| 最近2019中文字幕免费直播| 久久水蜜桃亚洲AV无码精品| 亚洲成在人线av| 在线免费不卡视频| 国产真人无码作爱视频免费| 永久亚洲成a人片777777|