2010-03-30 38 views
1

我有一箇舊的數據庫和一個新的數據庫。舊記錄最近轉換爲新數據庫。我們所有的舊應用程序都繼續指向舊數據庫,但新應用程序指向新數據庫。如何將一組數據與另一組數據同步?

目前舊的數據庫正在更新的唯一的一個,所以全天新的數據庫變得不同步。新數據庫在一天內不同步是可以接受的,所以直到我們所有的應用程序都指向新的數據庫,我只需要編寫一個夜間cron作業就可以使其更新。

我不想清除新的數據庫和運行完整的轉換腳本每天晚上,因爲這將減少運行時間,並會在我們這個表的審計創建一個爛攤子。

我想從舊數據庫中選擇所有的數據,將其轉換到新的數據庫結構在內存中,然後在新的數據庫插入之前檢查每個記錄的存在。完成之後,我將選擇新數據庫中的所有內容,並檢查它是否存在於舊數據庫中,如果不刪除它。

這是最簡單的方法嗎?

+0

只需要思考一下,但應用程序服務器(即N層數據庫應用程序)是避免此類問題的解決方案之一。使用應用程序服務器時,組件具有版本,且持久層隱藏在客戶端之外。 – 2010-03-30 16:32:26

回答

1

如果你的音量非常大,這種雙重比較方法將會變得很笨重。如果你的音量不高,那麼每晚做一個完整的更換是「更簡單」的。

假設你不必擔心容量,這就是數據倉庫的傢伙叫change data capture問題。如果您的舊數據庫在記錄上有時間戳記,那麼您至少可以保存一半的比較結果(您仍需要查找刪除記錄)。如果沒有,那麼這裏有一些其他的建議。

你可以把一個觸發舊的數據庫上寫出來的任何更改(插入,更新,刪除),舊的數據庫,然後每天晚上將那些到新的數據庫。

或者,您的數據庫系統可能有一個日誌(重做日誌,事務日誌等)中的每個數據庫事務的記錄。如果您有權訪問此日誌,那麼您可以每天晚上查詢自前一天晚上以來的事務。然後將這些事務應用到新數據庫。

0

我不知道這是否是簡單但肯定,在你的情況,是最安全的

如果您使用SQL2005或2008,我會在Integration Services中實現此功能。

0

我同意Paulo的說法,但取決於所有應用程序指向新數據庫需要多長時間才能使用工具來執行此操作,您可以查看SQL Data Compare http://www.red-gate.com/products/SQL_Data_Compare/index.htm這是一個偉大的工具,我用它在dev/pre-prod/prod服務器之間同步數據。

0

由於舊的數據結構可以「轉換」爲新的數據結構,因此您有很多選擇。這是一個需要考慮的問題。

創建對舊數據/表格的視圖。不是將數據轉換爲「內存」,而是創建執行這些轉換的舊數據的數據庫視圖。然後使用tSQL 2005和更高版本的EXCEPT子句與聯合來獲取所有更改。將查詢結果存儲在#temp表或@tableVariable中。然後執行刪除,插入和/或更新。

select 'inOldOnly' as whichServer, old.* 
from OldDb.dbo.vwOldStructureTransformed as old 

EXCEPT 

select 'inOldOnly' as whichServer, new.* 
from NewDb.dbo.NewStructure as new 

UNION 

select 'inNewOnly' as whichServer, new.* 
from NewDb.dbo.NewStructure as new 

EXCEPT 

select 'inNewOnly' as whichServer, old.* 
from OldDb.dbo.vwOldStructureTransformed as old 

這種方法相當靈活。在實踐中,我建議列舉列(與使用*相比)。如果我們知道有關舊數據庫和新數據庫大小的更多詳細信息,我們可以對WHERE子句中的行過濾是否有任何好處發表評論。

相關問題