1. 程式人生 > >如何進行異構資料庫同步

如何進行異構資料庫同步

1、詳細設計

1.1 SQL語句通用解析程式

首先需要一個通用的“SQL語句通用解析程式”,因為異構資料庫的大部分表都與另外的表有一一對應的關係,該解析程式用於對這些一一對應的表進行處理。

表與表之間的對應關係基於上篇提到的整理的Excel文件,“SQL語句通用解析程式”如何讀取對應關係對收到的INSERTUPDATEDELETE語句進行處理呢?筆者採用的是將對應關係寫入XML文件中,當然也可以採用另外的方式。

參考XML格式如下(Oracle 新系統 -> SQL Server舊系統):

<table name="freephone" partyName="PLAT_FreePhone"
fieldCount="8">
<field name="Phone" partyName="Phone" primary="true"/>
<field name="ProductID" type="varchar" partyName="ProductID" partyType="int"/>
<field name="AreaId" partyName=""/>
<field name="Effect" partyName=""/>
<field name="EffectLess" partyName=""/>
<field name
="Addtime" type="varchar" partyName="AddTime" partyType="datetime" partyValue/>
<field name="Operator" partyName="Operator"/>
<field name="Remark" partyName="Remark"/>
</table>

當一方對freephone表操作的INSERT語句:

insertinto freephone (Phone, ProductID, AreaId, Effect, EffectLess, Addtime, Operator, Remark)
values(‘13122223333’,‘003’,25,‘20110724000000’,‘20111024235959’,‘20110702409000000’, ‘amigo’, ‘amigo add!’)

根據上面XML配置和通用解析程式的處理,對應對方的新的SQL語句為:

INSERTINTO PLAT_FreePhone(Phone, ProductID, AddTime, Operator, Remark) values(‘13122223333’, 3, GETDATE(), ‘amigo’, ‘amigo add!’)

再看一條UPDATE語句:

update freephone set ProductID=004’, AreaId=26where Phone=13122223333

轉換為對方的語句為:

update PLAT_FreePhone set ProductID=4where Phone=13122223333

另外除了如上所演示的簡單的型別不同、欄位名稱不同,有些欄位在對方沒有外,有時候有些欄位還需要一定的轉換,例如在一方儲存的limited字串是二進位制方式,例如111111,而對方儲存的是二進位制對應的十進位制的值,再例如,一方儲存的是6位的時間(時分秒),而對方儲存的只是4位的時間(時分),那麼可做一次自定義的substr操作。

看另一個參考的XML例項:

<table name="phonelimited" partyName="PLAT_PhoneLimited" fieldCount="6">
<field name="Phonenumber" partyName="Phone" primary="true"/>
<field name="AreaId" type="int" partyName="AreaID" partyType="int"/>
<field name="Limited" type="varchar" partyName="Limited" partyType="int" function="binToDec"/>
<field name="AddTime" type="varchar" partyName="AddTime" partyType="datetime"/>
<field name="Operator" partyName="Operator"/>
<field name="Remark" partyName="Remark"/>
</table>

其中:function="binToDec"表示需要進行一次二進位制到十進位制的轉換,一方的如下語句:

insertinto phonelimited(Phonenumber, AreaId, Limited) values(‘13122223333’, 25, ‘10110’)

轉換成對方的INSERT語句如下:

insertinto PLAT_PhoneLimited(Phone, AreaID, Limited) values(‘13122223333’, 25, 22)

需要做取字串操作的參考定義如下:

<field name="StartTime" length="6" partyName="OpenTime" partyLength="4" function="substr"/>

另外,還有一些欄位本端沒有,對端具有並且有點還是必填欄位,並且對端的這些欄位需要填寫固定的值,因此在INSERTUPDATEDELETE語句都需要進行特別的操作,參考XML定義如下:

……
<insert fieldCount="2">
<field name="Node" value="0"/>
<field name="Key" value=""/>
</insert>
<update condition="and Node=0 and key=''"/>
<delete condition="and Node=0 and key=''"/>
……

1.2 SQL語句接收器程式

異構資料庫的SQL語句傳過來時,需要一個SQL語句接收器程式,該接收器解析該語句操作的表名(例如phonelimited)、執行的操作名(INSERTUPDATE還是DELETE),根據這些資訊讀取配置檔案資訊,決定是呼叫“1.1 SQL語句通用解析程式”進行處理,如果不是存在一對一對應關係的表,扔給配置的指定業務進行特別處理。

該程式的主要功能如下:

1)接收SQL語句:只接收需要同步的表的INSERTUPDATEDELETE語句,SELECT語句直接丟棄;

2)分發SQL語句:將語句分發給不同程式進行處理,解析接收到的SQL語句的表名和操作名稱,決定分發給通用解析進行處理還是特定解析程式進行處理。

需要關注的問題:當多條SQL語句併發傳送過來時,是啟動多個獨立的自動機處理,還是將語句放入佇列中,依次出佇列進行處理,還是採用其它方式進行處理呢?每條SQL語句啟動獨立的自動機處理效率最高,但是也存在問題:因為多條語句是競爭操作,如果操作的是同樣的記錄但做相反操作時怎麼辦?這些都是開發人員需要考慮到的問題。

1.3 SQL單個表特定解析程式

在上篇中提到,並不是所有的表在兩端有一一對應的表,對於一些本端一個表對應對端資料庫多個表,或者本端多個表對應對端一個表的情況,通用解析程式不好處理這些語句,可將這些表採用特定的解析程式進行處理。

對於一個表對應多個表的情況,可能一條INSERT語句對應對端資料庫多條INSERTUPDATE語句。

對於多個表對應一個表的情況,一條INSERT語句可能對應對方的一條INSERT語句或UPDATE語句。

1.4 帶事務的操作

像註冊等流程,要嚴格保證事務,因此採用新舊系統提供介面(例如http介面或SOAP介面等)的方式,當某一端呼叫註冊流程成功後,呼叫對端系統提供的註冊的介面完成操作。

因為這種操作並不多,所以並不需要太多的工作量。

1.5 資料校驗程式

要定期(一般是一天)對兩邊資料進行校驗,對一些錯誤的資料及時的更正,進行資料校驗首先要確定哪些東西需要進行資料校驗,接著有針對性的進行核對。

2、擴充套件閱讀

2.1 資料同步方法

物件變化是資料同步的基礎,它直接決定了資料同步的更新方式和選時方式,所以資料同步常常按照變化捕獲的不同進行分類,一般歸結於如下集中基本方法:

1)基於快照法:快照是資料庫中儲存物件在某一時刻的即時映像。通過同步物件定義一個快照或採用類似方法,可以將它的當前映像作為更新副本的內容。

2)基於觸發器法:在源資料庫為同步物件建立相應的觸發器,當同步物件進行INSERTUPDATEDELETEDML命令時,觸發器被喚醒,將變化傳播到目標資料庫。

3)基於日誌法:資料庫日誌作為維護資料庫完整性的資料庫恢復的重要工具,其中已經包含了全部成功提交的操作記錄資訊。該方法通過分析資料庫日誌的資訊來捕獲同步物件的變化序列。

4)基於API:一些小型的資料庫和非關係型資料庫沒有觸發器和日誌機制,可以在應用程式和資料庫之間引用一層中介軟體,由它提供一系列API,在API上來完成應用程式對資料庫修改的同時,記錄同步物件的變化序列。

5)基於影子表法:許多情況下,源程式無須瞭解同步物件的每一個操作,只要知道最後總共發生了什麼變化就夠了。因此,可以在初始化時為同步物件表T建立一個影子表S,作為一份當時的拷貝,以後通過在適當時機通過比較當前TS的內容獲取淨變化資訊。

6)基於控制表變化法:就是為每個要同步的表建立一個控制表CC包含了主鍵欄位Pk和一些控制資訊欄位,當T中某個欄位發生改變時,C中同主鍵Pk的記錄也隨即被修改。這一過程通常可以通過觸發器實現,到時候只需根據C就知道T中的變化資訊。

3、附錄

1)《異構資料庫同步問題研究》:

http://wenku.baidu.com/view/d3b283bff121dd36a32d8293.html