如何在同步過程中將數據庫日誌線性交易轉化爲併發載入

如何在數據庫同步中將數據庫日誌線性交易轉化爲併發載入數據庫日誌的記載是按照SCN號順序記錄的,雖然有時也有併發交易出現,導致日誌中有SCN號交替出現的交易,但是對於已經發生的交易存在下面三個規律:
      1、先提交的交易獲得的SCN號較小
      2、每個交易中的SCN號一致,這是區分交易的主鍵
      3、SCN號是連續的,不存在SCN號在日誌中不出現的情況


      基於上面SCN號的規律,在數據庫同步應用中我們抽取日誌時爲了提升抽取效率,我們採用了連續讀入的方式,對於SCN號採用動態排序的方式。即取數據庫日誌的時候我們順序讀取SCN號,不過在沒有得到提交SCN標誌時,我們只是在內存按照鏈表進行記錄,只有當讀入提交標誌的時候才更新鏈表,之後把鏈表中BEGIN和END之間的SQL語句寫入文件,再把該鏈表元素刪除,這樣的話內存會動態增加/減少,對於大交易(每筆交易100萬SQL語句以上)系統佔用內存會很多,所以建議這部分交易最好是夜間進行,這就是許多金融、證券行業運行的批處理交易。

      那麼當我們向文件寫入的時候就會出現大交易還沒進行完,小的交易已經處理了很多筆的情況,我們取SCN號就會出現小交易的序號在前邊,最後寫的大交易在後面的情況,如何解決這樣的問題,讓分析組件能及時獲得下一個SCN的位置呢?這就需要一個索引文件進行記錄,類似文件分配表的ALLOC文件,內容很簡單,包含三個元素:SCN號、文件名稱、偏移量。這三個內容就能夠爲同步程序帶來繼初始化以來的所有交易SCN號的文件位置對應關係,並且利用固定長度我們可以把所有SCN號情況記錄下來。因爲分析組件必須按照SCN號順序進行,除非該SCN號是DBA操作的DCL,其他情況必須嚴格順序執行,否則就會出現同一張表順序不同SQL語句執行導致數據錯誤的情況。

      通過上面的轉換,我們已經把主數據庫的日誌文件進行了順序分析,並取得了兩個文件,一個交易文件,一個是對應的SCN索引文件。下面分析組件就可以根據SCN號的順序來產生裝載文件,如果是順序裝載則直接按照SCN號順序,發送SQL語句到備庫執行即可。

      但是如何作到並行裝載的目標呢,這就要用到網格裝載技術。即創建多個表裝載隊列,每個隊列是按照SCN號順序在該表執行的順序,這樣每個表裝載進程就可以按照自身的同步內容獨立執行,即使有大交易執行,只要沒有和其他交易有相關的表操作,其他表的交易均可以提前於大交易執行到備庫,這樣就可以達到並行裝載的目的。雖然可以提高效率,但是又帶來了如何保證交易提交的原子性,這就必須引入網格斷點技術,詳見《如何保證目的端交易提交的原子性》
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章