2010-10-17 77 views
1

我有一個源數據庫(Sybase),它是隻讀的,您可以使用導入文件寫入數據庫。另一面是我自己的數據庫(MSSQL),它沒有任何限制。如何實現快速數據庫同步。只讀源?

主要問題是第一個數據庫上沒有時間戳,我沒有任何訪問權限來更改源數據庫。那麼是否有引擎/解決方案來實現此同步?做了什麼?

回答

1

差異算法可能有效,但速度不會很快,因爲您必須掃描整個源數據庫才能進行每次同步。

基本上你會做了充分的數據提取物,在商定,並且穩定,方式(即。兩個這樣的萃取液用無改變之間會產生相同的輸出。)

然後,你比較,爲前面的提取物你做了,然後你可以找到所有的變化。比純文本差異稍微聰明一些的東西是需要的,以幫助確定行不僅僅是刪除+插入,而是實際更新。

不幸的是,如果沒有辦法問源數據庫最新的變化是什麼,如您所指出的那樣,缺乏時間戳或類似的機制,那麼我看不到如何獲得比每次完整的提取都要好。

現在,我不太瞭解Sybase,但是在MS SQL Server中,您可能會創建另一個反映第一個數據庫的數據庫,並且在此第二個數據庫中,您可以進行所需的任何更改。

但是,如果您可以在Sybase中創建這樣的數據庫並使用SQL同時訪問這兩個數據庫,那麼您可能能夠運行產生差異的查詢。

例如,沿着線的東西:

SELECT S.* 
FROM sourcedb..sourcetable1 AS S 
    FULL JOIN clonedb..sourcetable1 AS C 
    ON S.pkvalue = C.pkvalue 
WHERE S.pkvalue IS NULL OR C.pkvalue IS NULL 

這將產生被插入或刪除的行。

爲了找到那些改變,你會需要這個WHERE子句:

WHERE S.column1 <> C.column1 
    OR S.column2 <> C.column2 
    OR .... 

由於表的連接,在WHERE子句會過濾掉任何行,其中前面的提取物和目前的狀態是不同的。

現在,這可能不會跑得很快,你必須測試以確保。

+0

感謝您的回答。主要問題是我無法使用SQL - 我必須使用ADO.NET。所以我必須從雙方加載所有數據,獲取更改並更新目的地。 – 2010-10-20 09:15:27

+0

兩臺服務器的數據是否改變?或者你只是想將所有內容都鏡像到只讀數據庫中? – 2010-10-20 11:46:53

+0

是和否;-) 源數據庫是隻讀的,目的地是我的數據庫。 源數據庫的更改必須位於目標數據庫中。來自目標數據庫的更改將作爲文本文件導入到源數據庫中。所以如果你只看到沒有文本文件的任務 - 是的,它只是一面鏡子。 – 2010-10-21 06:45:18