一個中型或大型公司往往由地理上分散的部門所組成,這些部門通常需要進行數據共享。針對這些共享數據,可以將其存儲在某個站點上,需要的用戶都從這個站點上存取。這種方案的優點是數據的一致性容易保證,但其缺點也是很突出的,那就是該站點的負載大、網絡負載大,遠程用戶的數據響應遲緩。數據復制技術可以有效地解決這個問題,它通過將這些共享數據復制到位於不同地點的多個數據庫中,從而實現數據的本地訪問,減少了網絡負荷,並提高了數據訪問的性能,而且通過對數據庫中的數據定期同步(通常是每天晚上),從而確保了所有的用戶使用同樣的、最新的數據。該技術適用於用戶數量較大、地理分布較廣、而且需要實時地訪問相同數據的應用模式。
數據復制的概念及特點
1、數據復制的概念及分類
數據復制,就是將數據庫中的數據拷貝到另外一個或多個不同的物理站點上,從而保持源數據庫與目標數據庫中指定數據的一致性。
按照數據復制的實時性,數據復制可分為同步數據復制和異步數據復制。同步數據復制是指將本地生產數據以完全同步的方式復制到異地,每一本地IO交易均需等待遠程復制的完成方予以釋放。異步數據復制則是指將本地生產數據以後台同步的方式復制到異地,每一本地IO交易均正常釋放,無需等待遠程復制的完成。同步復制實時性強,遠端數據與本地數據完全同步。但這種方式受帶寬影響較大,數據傳輸距離較短。異步復制不影響本地交易,傳輸距離長,但其數據比本地數據略有延遲。在異步復制環境中,對於所有應用最關鍵的就是要確保數據的一致性。
按照復制站點的類型,數據復制可分為多主控站點復制、物化視圖復制及混合復制。多主控站點復制也稱為對等站點復制,其中每個站點都是主控站點,都需要與其他站點進行信息交流,各站點之間是平等的。物化視圖復制包含一個主控站點、一個或多個物化視圖站點,
物化視圖中的內容可以為目標主對象在某個時間點的全部拷貝或部分拷貝,其中目標主對象既可以是主控站點上的表也可以是物化視圖站點上的主物化視圖。混合復制包含多個主控站點和多個物化視圖站點,是主控站點復制和物化視圖復制的結合體,適合於復雜的業務情況。
2、數據復制的特點
數據復制通過在多個站點上建立備份,能夠提高數據的安全性,同時也提高了數據的可用性,這是因為如果一個站點出現了問題,用戶可以選擇其他站點繼續進行操作,應用系統還可繼續運行,從而數據復制提供了容錯保護機制。
然而數據復制最基本的功能是提高數據庫的性能。
它通過將遠程數據庫中的數據復制到本地,使得應用能夠就近訪問數據,從而降低網絡傳輸負載,提高效率。而且在數據復制系統中,可以提供多個站點之間的負載平衡,讓這幾個用戶使用這個,另外幾個用戶可以
使用其他的,以避免某些站點負載過重。
物化視圖還提供了按子集進行復制,這樣各站點就可只復制自己需要的數據,也能減輕網絡的傳輸量。
數據復制的實現方法
在具體的實現之前,首先要做好設計與規劃。這就需要細致分析具體的業務情況,設計出一套能夠滿足業務需要的方案。通常在設計過程中,需要確定出要建立的數據庫站點,各站點的類型,需要復制的數據對象,以及同步方式、沖突解決方案等內容。
在設計完成之後,就可具體來實現數據復制,實現主要包括以下幾步:
(1)創建復制站點
(2)創建組對象
(3)配置沖突解決方案
下面我們舉一個例子來說明各步具體需要完成的工作。在這個例子中我們采用多主控站點復制方式,設有兩個主控站點和兩個共享數據表。兩個主控站點分別為:處理站點(cl.world)和解釋站點(JS.wo rld);兩個數據表為測區( survey)和測線( line)。
STEP1 創建復制站點
(1)首先以SYSTEM身份登陸主站點數據庫cl.worldCONNECT system/[email protected]
(2)創建用戶—復制管理員,並為該用戶授權復制管理員負責復制站點的創建和管理,每個復制站點都必須創建復制管理員:
CREATE USER repadmin IDENTIFIED BY repadmin;
BEGIN
DBMS_REPCAT_ADMIN.GRANT_ADMIN_ANY_SCHEMA (username => ’repadmin’);
END;
(3)為本站點指定傳播者
傳播者負責將本地最新更新的數據傳播到其他站點上:
BEGIN
DBMS_DEFER_SYS.REGISTER_PROPAGATOR (username => ’repadmin’);
END;
(4)為本站點指定接收者
接收者負責接收其他站點上的傳播者傳送過來的數據:
BEGIN
DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP (
username => ’repadmin’,
privilege_type => ’receiver’,
list_of_gnames => NULL);
END;
(5)確定清除時間
為了使傳送過來事務隊列不致過大,需要將成功加載的事務從事物隊列裡清除掉,這裡設定每小時清除一次。
CONNECT repadmin/[email protected]
BEGIN
DBMS_DEFER_SYS.SCHEDULE_PURGE (
<p>
next_date => SYSDATE,
interval => ’SYSDATE + 1/24’,
delay_seconds => 0);
END;
在建立好站點cl.world後,以同樣的方法創建站點JS. world。
(6)創建各主控站點之間的調度鏈接
創建各主控站點之間的調度鏈接需要先在各主控站點間建立數據庫鏈接,之後為每個數據庫鏈接定義調度時間。
首先,在處理站點上建立與解釋站點的數據庫鏈接,這裡需要先建立一個公用數據庫鏈接,供其他私有數據庫鏈接來使用。
CONNECT SYSTEM/[email protected]
CREATE PUBLIC DATABASE LINK js.world USING ’JS.world’;
CONNECT repadmin/[email protected]
CREATE DATABASE LINK JS.world CONNECT TO repadmin
IDENTIFIED BY repadmin;
同樣,在解釋站點上建立與處理站點的數據庫鏈接
CONNECT SYSTEM/[email protected]
CREATE PUBLIC DATABASE LINK cl.world USING ’cl.world’;
CONNECT repadmin/[email protected]
CREATE DATABASE LINK cl.world CONNECT TO repadmin
IDENTIFIED BY repadmin;
調度鏈接確定本站點上的事務向其他站點發送的頻度,
下面的代碼為10分鐘一次:
CONNECT repadmin/[email protected]
BEGIN
DBMS_DEFER_SYS.SCHEDULE_PUSH (
destination => ’JS.world’,
interval => ’SYSDATE + (1/144)’,
next_date => SYSDATE,
parallelism => 1,
execution_seconds => 1500,
delay_seconds => 1200);
END;
在解釋站點上做相同的工作STEP2 創建主控組在復制環境中,Oracle用組來管理復制對象。通過將相關的復制對象放在一個組裡,從而方便對大量數據對象的管理。
這裡我們假設用戶模式integr ation 在處理站點和解釋站點都已存在,而且表測區(survey )和測線(line)也已經創建。
(1)創建主控組對象
CONNECT repadmin/[email protected]
BEGIN
DBMS_REPCAT.CREATE_MASTER_REPGROUP (
gname => ’inte_repg’);
END;
(2)向主控組中添加數據對象,將測區表survey加入到組inte_repg中
BEGIN
DBMS_REPCAT.CREATE_MASTER_REPOBJECT (
gname => ’inte_repg’,
type => ’TABLE’,
oname => ’survey’,
sname => ’integration’,
use_existing_object => TRUE,
copy_rows => FALSE);
END;
以同樣的方法將測線表line 加入到組inte_repg中
(3)在主控組中添加其他參與復制的站點,數據庫之間的同步方式在此指定
BEGIN
DBMS_REPCAT.ADD_MASTER_DATABASE (
gname => ’inte_repg’,
master => ’JS.world’,
use_existing_objects => TRUE,
copy_rows => FALSE,
propagation_mode => ’ASYNCHRONOUS’);
END;
(4)如果可能出現沖突,則需要配置沖突解決方案。沖突解決方案將在後面介紹。
(5)為每個對象生成復制支持 BEGIN
DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT (
sname => ’integration’,
oname => ’survey’,
type => ’TABLE’,
min_communication => TRUE);
END;
yle="TEXT-INDENT: 2em">
測線表line也一樣
(6)重新開始復制
BEGIN
DBMS_REPCAT.RESUME_MASTER_ACTIVITY (
gname => ’inte_repg’);
END;
以同樣的方式設置解釋站點。設置成功後,數據復制過程就宣告完畢,庫中的數據就可進行復制。
數據復制中沖突的解決方案
在復制環境中,盡管在數據庫和應用程序設計過程中,會盡量避免各站點間沖突的發生,但完全避免沖突的可能性還是比較小的,那麼一旦沖突發生,就需要一個按照具體業務規則的沖突解決機制,來使得各站點的數據保持一致。
首先需要分析哪些對象容易出現沖突。通常來說,靜態的數據變化少,沖突出現的可能性也小;而有些數據變化非常大,沖突出現的可能性也大。確定了沖突易發的對象後,需要確定怎樣解決沖突,比如在各站點之間建立優先次序,在數據不一致時,以某個站點上的為
准;或以某個站點上最新的修改為准。
Oracle提供了多中沖突解決方案,具體包括:針對更新沖突的方案、針對唯一性沖突的方案、針對刪除沖突的方案。除了這些方案以外,用戶還可以自定義沖突解決方法。每種方案都有自己的適用情況,那麼我們需要根據具體的業務來選擇合適的沖突解決方案。
結束語
本文詳細介紹了分布式系統Oracle中的數據復制技術,在具體應用中,還有許多比較復雜的問題需要解決,比如主控組中如果包含循環依賴的表或自相關的表時如何處理;如何利用模版機制來創建物化視圖站點;如何對數據復制環境進行管理與維護。這些問題需要在實際
應用中逐步探索,深入研究。