在我正在研究的項目中,我們使用Oracle Streams
來支持多主複製(我們在紐約,倫敦和新加坡全球運營3個站點,都需要讀取和更新相同數據的能力)。
流支持我們用於監管要求的條件複製(例如在新加坡,私人銀行客戶端數據不能離開該國)。
使用Streams,您可以例如複製整個模式(DML和/或DDL)或只是一個表的列表。在事務中,你可以控制數據流,使複製的對象上各行的操作不會複製..eg:對於這樣一個場景,is_secure
是真的
if (is_secure)
then
dbms_streams.set_tag('01'); -- set a non null tag to prevent replication.
end if;
insert into your_table()..values();
if (is_secure)
then
dbms_streams.set_tag(''); -- set a the null tag back
end if;
insert into your_table()..values();
,只有第二條規則將複製(你可以設置你如果存在非空流標記,則不復制複製規則)。所以在你的代碼中,如果數據是安全的,你只需設置這個標籤。這種方式流不會將此事務應用於遠程站點。
對於多主複製,您應該預先考慮「衝突」的可能性,即兩個+站點並行修改相同數據的可能性。你應該處理這個問題(你可以設置適用於複雜場景的處理程序)來解決衝突而不會導致應用錯誤。例如,這將是一個複製的對象一個糟糕的設計:
create table foo
(
id number primary key,
data
);
create sequence foo_seq start with 1 increment by 1;
如果在這兩個網站上創建的,在平行有人發佈現場1:
insert into foo (id, data) values (foo_seq.nextval, 'a');
與本站2:
insert into foo (id, data) values (foo_seq.nextval, 'b');
這兩個站點都嘗試在主鍵中插入「1」。這會在複製時失敗,並且最終會出現應用錯誤。
,你可以上的其他內線一個env和start with 101 increment by 100
每個ENV例如start with 100 increment by 100
這將消除這一問題,和/或添加設置爲1
或2
等,爲每個站點location_id
列設置不同的序列。
此外,您需要更新ale以處理同時更新同一行的兩個站點(因爲站點之間總是存在一點延遲......延遲越多,進入需要衝突的場景的變化越多處理)。
流設置和理解有點複雜,所以您需要仔細閱讀相關主題。它非常成熟並且仍然得到支持,但就增強而言,從現在開始它不會太多,因爲Oracle專注於Goldengate(GG是許可產品,因此會產生額外成本,而Streams是企業許可證的一部分)。
複製可以很快變得複雜,特別是雙向複製。仔細閱讀oracle文檔。我不知道你是否對任何PK使用oracle序列,但是如果它們不同步或者在兩個dbs中存在不同的實體,那總是很痛苦。我只使用單向複製。它確實有用,但需要進行大量的計劃,測試,測試和測試! – OldProgrammer 2013-03-13 16:59:35