Oracle相關分布式資料解決方案
可能在雲端運算、SOA架構下這種方案會逐漸消亡,但是目前還是比較實用的,本文簡單介紹了常用的資料同步方案,由於正在使用進階複製的解決方案,所以重點說了oracle的進階複製
一、常見的分布式資料解決方案
如果資料庫為oracle、資料分散的分布式系統,常可以見到入下的分布解決方案
非即時,批量同步
1.ETL工具或者自己開發的介面
一般對應於特定格式的資料檔案,使用FTP服務。
資料倉儲或者資料集市可以使用ETL工具做資料整合,一般系統都是自己寫的介面程式實現。常規思路是資料匯入介面表,清洗後進入正式表
匯入方式非常多,如果資料量很大可以使用sqlLoder,如果資料不大,可以逐行匯入並同時清洗。就我的經驗來看,將清洗邏輯放在資料庫比較好。
也有可能是通過http獲得的XML檔案,這時需要自己定製XML的解析程式,讀出CDATA節。進階程式語言這方面的功能都很強大、簡單。
即時、小批量同步
1.第三方提供的
對於關鍵系統,可以使用中介軟體保證資料的安全、穩定。比如BEA的Tuxedo就不錯。
2.自己開發
如果都是unix機器可以使用socket編程,資料打成包發送,穩定性可以保證。經常是打成XML的格式,資料檔案的自描述能力比較強。
這兩種方案在電信等系統都可以見到,還是比較可靠的。
3.oracle自己提供的
3.1即時表介面
使用db_link和預存程序,結合job,很靈活和強大。
3.2 oracle進階複製
如果需要保證雙向的即時資料同步,同時複製環節又比較複雜,存在多個複製結點,可以使用Oracle的進階複製,上個月 濟南網站建設 做的房產局項目中使用了這種方案。雖然就這個項目來說,不太適用使用這種方案,但由於曆史的原因,為了一期系統的需要我們延續了這種同步方案。這篇文章主要就進階複製的過程進行說明:
二、進階複製基本概念
1.相同資料會存在於多個結點,這種環境更適宜使用進階複製
2.在不同版本和不同作業系統之間的ORACLE,都可以使用advance replication
3.幾個名詞
replication object:複製對象,包括表、索引、預存程序
replication group:複製組,複製對象的集合,一個group包含多個object,一個object只能屬於一個group
replication site:複製網站
4.multimaster replication:特點:全表複製,每個事務後都可進行複製
複製方式
非同步複製:推後的時間內複製到其它master,也叫store and forward data replication
同步複製:立刻更新到其它master,也就real time data replication
procedual replication: 包產生一個wrapper,資料變化通過預存程序完成,某個master中的procedure被調研,wapper會保證其它site中 的procedure也被調用,在有大資料量操作時可減少網路負載
非同步呼叫過程
DML操作(或者wappers)產生由內部觸發器一個延時rpc並放入延時事務隊列,1個site有延時事務隊列,1個隊列被多個group共用
出現錯誤將事務放入錯誤隊列,事務成功結束後,由purge job從源site的事務隊列中刪除事務
同步複製過程
DML操作被立刻捕獲,事務立刻執行,任何一個網站出錯、交易回復,先鎖住本地行,使用after row觸發器鎖住遠端行,所有網站提交後 oracle才會解鎖,極為依賴系統和網路的可用性
三、進階複製建立步驟:
網上的資料很多,也很詳細,其中eygle的比較詳細的經典,大家搜一下就可以看到,我就簡單說一下,並就自己碰到的問題描述一下解決辦法
1.調整oracle環境,建立repadmin使用者,為用法賦權
2.建立db_link
3.複製組中建立複製對象
可使用圖形化工具或者手工指令碼建立,由於表很多,而且正式部署還有再次建立,這裡我使用了手工指令碼方式
--建立複製組:
DBMS_REPCAT.CREATE_MASTER_REPGROUP(
gname => '"***"',
qualifier => '',
group_comment => '');
--在複製組裡加入複製對象:
DBMS_REPCAT.CREATE_MASTER_REPOBJECT(
gname => '"**"',
type => 'TABLE',
oname => '"TEST"',
sname => '"LFGISTEST"',
copy_rows => false,
use_existing_object => TRUE);
--對複製對象產生複製支援:
DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT(
sname => '"LFGISTEST"',
oname => '"TEST"',
type => 'TABLE');
--添加主體複製節點:
DBMS_REPCAT.ADD_MASTER_DATABASE(
gname => '"***"',
master => '***',
use_existing_objects => TRUE,
copy_rows => false,
propagation_mode => 'ASYNCHRONOUS');
--在主體定義網站啟動複製:
DBMS_REPCAT.RESUME_MASTER_ACTIVITY(gname => '"***"',true);
碰到的錯誤
1.db_link建立後無法使用,發現db_link起的名稱有問題
解決方案:如果global_names = true;db_link名稱一定要和global_name一致,修改後成功
2.添加主體複製節點時報錯:
ORA-23357: the propagator does not exist
ORA-06512: at "SYS.DBMS_REPCAT_CACHE", line 76
ORA-06512: at "SYS.DBMS_REPCAT_MAS", line 2105
ORA-06512: at "SYS.DBMS_REPCAT", line 146
ORA-06512: at line 2
可能原因:
1.global_name使用了oracle的保留字,參考:http://oracle-tech.blogspot.com/2008/08/ora-23375-when-adding-new-master-site.html
修改外網(61)global_name 為OUT.WWKJ.LZFC2
alter database rename global_name to OUT.WWKJ.LZFC2;
2.REPADMIN使用者權限不足,檢查賦許可權的語句,確保許可權到位
3.db_link必須使用REPADMIN串連對端資料庫,我就是因為這個原因報的錯
4.據說兩台資料庫的域必須一樣
5.兩台機器的使用者和schema應該一致
解決方案:呵呵,很粗心啊,沒有用repadmin運行指令碼
3.複製組中加入複製對象時候,報23312錯誤,當前網站不是masterdef
Oracle Error : ORA-23312: not the masterdef according to string
Cause: The group name is null, the group name is misspelled, the invocation or given database is not the masterdef, or one of the masters does not believe the invocation database is the masterdef.
Action: If the given group name and masterdef were both correct, connect to the masterdef and retry the request, or relocate the masterdef at the (errant) databases using relocate_masterdef.