顧鵬程
摘 要Oracle Streams是Oracle官方提供的一種免費、靈活的數據庫同步機制,只需通過配置官方的存儲過程即可部署。由沖突事務導致的穩定性不足,是Streams部署中最難以處理的問題。Oracle建議的常規的沖突處理方法需要按表綁定存儲過程,不利于處理新表沖突,其提供的自定義沖突處理存儲過程功能較為簡單,適用性低。本文針對Streams雙向同步中常見的沖突,提出一種不需要綁定表且具有一般適用性的沖突處理部署方法,能夠自動化處理錯誤事務,實驗證明該方法具備一定的可靠性。
【關鍵詞】Oracle Streams 沖突處理 錯誤事務
Oracle Streams 是 Oracle提供的流復制技術,可以實現數據容災和數據共享。其基本思想來源于 Oracle 高級隊列,是其應用的延伸,它還可以傳遞消息隊列,具有免費、靈活的優勢。其缺點是穩定性差。在生產實踐中,主要發現有兩種沖突影響Streams同步,分別為刪除沖突和更新沖突,均由被修改行在目標數據庫找不到對應記錄導致。
對于刪除沖突,一般Oracle建議采取對目標行標記的方法,但這會導致兩個數據庫不一致。對于更新沖突,Oracle提供了預置的自動存儲過程來作簡單的處理。該存儲過程需要指定參數表名、方法名等,配置繁瑣。此外,Oracle還提供自定義存儲過程來配置刪除或更新沖突。該方法需要指定表名以及對應的存儲過程,需要對每張表進行設定,這不利于對新增表的維護。對于這些問題,本文提出一種結合Oracle定時任務和不需要綁定表的自定義存儲過程的方法,讓Oracle自動修正沖突,以確保兩個數據庫的一致性。
1 定制處理沖突的存儲過程
處理沖突的存儲過程本質上是根據發生streams同步錯誤的事務號,找到對應沖事務LCR,結合錯誤類型,調整LCR中的事務內容,使其正確執行。
1.1 處理刪除沖突的存儲過程
有兩種方式處理這種沖突:
(1)可以選擇不使用事務在物理上刪除行,而是更新一個“刪除”列,將行表標記為“已刪除”,這樣不會發生刪除沖突,但可能引發更新沖突,需要另置存儲過程處理。
(2)可以簡單的舍棄掉刪除失敗的事務,并移除錯誤,使后續同步繼續。本文以第二種方法為例實現存儲過程。
首先通過DBMS_APPLY_ADM.GET_ERROR_MESSAGE存儲過程獲得錯誤事務的LCR,然后用GET_COMMAND_TYPE函數可以獲得該操作的增、刪、改類型。
舍棄該刪除操作其實就意味著直接移除事務,執行DBMS_APPLY_ADM.DELETE_ERROR,最后讓同步重新啟動:DBMS_APPLY_ADM.START_APPLY。
1.2 處理更新沖突的存儲過程
考慮在生產環境中,一個更新沖突往往意味著目標數據庫缺失對應記錄,因此,本文采用將更新事務的LCR修改為插入事務的方式。同時為了避免插入事務在雙向同步中反同步到源數據庫,將為Oracle會話增加一個標記,使同步忽略來自標記事務。
獲取錯誤事務LCR以及事務類型的方式與上一節相同。下面假設錯誤事務已被判別為DML操作中的UPDATE類型。
首先調用DBMS_STREAMS_ADM.SET_TAG存儲過程為該會話加一個標記,本文采取十六進制0作為標記。這樣存儲過程中的事務將不會被復制到另一個數據庫。
由于更新語句可能只包含部分字段值,所有需要獲得所有字段值,以插入完整記錄。假設已獲取LCR。用GET_VALUES('OLD') 獲取未被更新的舊值。為了將UPDATE類型的LCR完整的轉變為INSERT類型,需要用SET_VALUES將舊值設為NEW。然后將修改后的LCR用EXECUTE(TRUE)執行。
最后用和上一節相同的語句移除錯誤事務并開啟同步即可。
為了使存儲過程的調用變得簡潔,將可上述兩種存儲過程合為一個。
2 處理流程
首先定義一個存儲過程,定時查詢DBA_APPLY_ERROR表,一旦發現錯誤事務,就調用沖突處理存儲過程。定時觸發采用DBMS_JOB.SUBMIT程實現,每3分鐘查詢一次。
實際應用中主存儲過程的調用頻率可根據需要調整。一般情況,沖突并非配置了雙向Streams同步的數據庫所應當出現的,因而可認為是低概率事件,配置幾分鐘一次的檢查即可。
3 模擬測試
在實驗中,模擬連續100個刪除沖突,按本文方法部署的沖突處理能夠在20分鐘內全部處理完畢,并使同步復原。模擬連續1000個更新沖突,本文方法用大約4小時10分鐘修復完畢。從量級上來說,顯然比人工處理節約人力與時間。此外,一般若生產環境中的數據庫使用得當,不會一次性有這么多沖突,本文方法對大量的同步沖突有一定的適應性。
4 結論
本文針對Oracle雙向streams同步中的沖突問題,指出常規方法的局限性:需要綁定表以及人工處理。為了解決這兩種不足,首先定義了一個具有廣泛適用性的沖突事務處理存儲過程,能夠將錯誤事務的LCR修正并執行,以使同步繼續。然后定義了一個查詢沖突事務的存儲過程,配合Oracle定時任務,實現沖突事務的自動化處理。經過沖突事務的模擬實驗,該方法對平臺沒有依賴性。對于頻率較低的沖突事務,具有較好的處理時效;對于大量沖突事務,亦具備一定的承載能力。在生產環境中,按本文部署沖突處理策略,能夠在節省人力和時間同時加強streams雙向同步的穩定性。
參考文獻
[1]蔡小祥,李曉華.Oracle STREAMS數據同步復制技術應用[J].醫學信息學雜志,2015,36(02):38-40+60.
[2]肖述.Oracle流復制技術在省級數據中心中的應用[J].無線互聯科技,2016(04):136-137.
[3]成雅.基于Oracle Streams的數據庫實時備份與恢復技術研究[D].南京航空航天大學,2012.
作者單位
南京國電南自電網自動化有限公司研發中心 江蘇省南京市 211100