本文簡(jiǎn)要介紹了Oracle的高級(jí)復(fù)制功能,并通過(guò)一個(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)化查詢(xún)語(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ù)的過(guò)程。
高級(jí)復(fù)制,是在組成分布式數(shù)據(jù)庫(kù)系統(tǒng)的多個(gè)數(shù)據(jù)庫(kù)中復(fù)制和維護(hù)數(shù)據(jù)庫(kù)對(duì)象的過(guò)程。 Oracle 高級(jí)復(fù)制答應(yīng)應(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è)DB(ORACLE9.2,雙網(wǎng)卡),負(fù)責(zé)接收申報(bào)和反饋審批結(jié)果。
內(nèi)網(wǎng)有一個(gè)WEB(+APPSERVER),一個(gè)DB(ORACLE9.2,雙網(wǎng)卡),負(fù)責(zé)接收申報(bào)和反饋審批結(jié)果,以及通過(guò)審批流程處理來(lái)自外網(wǎng)的審批申報(bào)。
由上可知,內(nèi)網(wǎng)功能包括外網(wǎng)功能,不過(guò)外網(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:00至18:15(或其它時(shí)段)為維護(hù)時(shí)段,該時(shí)段內(nèi)外網(wǎng)均停止作業(yè),由系統(tǒng)治理員把與內(nèi)外網(wǎng)DB相連的所有網(wǎng)線均斷開(kāi),用一根直連網(wǎng)線把兩臺(tái)DB連接,通過(guò)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_gnames為null,意味著可以治理所有對(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');