最近數據庫升級到2008,研究了一下,發現有一個很好用的新功能,merge 語句加上存儲過程,可以實現數據的差異傳輸,源表的增刪改,都可以使用 merge 語句,把數據更改應用到目標表上,我們原來一個2億多條記錄的表,完全傳輸一次需要3個多小時,使用這個方法進行數據傳輸,首次花的時間和原來差不多,但是在以後的定時作業裏面,看到傳輸時間只有不到 10分鐘了,經大量數據抽樣檢查,數據是完全相同的,通過優化,以及增加作業的頻率,可以實現數據更短的時間差,這對於表比較大,而且需要進行不定期同步的情況來說,節省了不少時間,當然,數據庫鏡像 和 數據發佈訂閱也能解決這個問題,但是對應用比較簡單,數據同步實時性要求不高,數據量巨大的情況,這個方法部署起來還是相對簡單一些的,呵呵
這個方法非常實用,但是還存在一些侷限性,要根據每個表的不同,需要單獨建立存儲過程,這點比較繁複,有沒有更好的方法,能使用在所有的表上呢??
先把單獨一個表的情況,發出來讓大家分享一下,歡迎各位大俠提出更好的解決辦法,能夠實現多表通用
1:先在目標服務器上建立一個到源服務器的鏈接服務器,名字 xx2008(比較簡單,不詳細說了)
2:在表裏面,增加一個字段 updatetime,記錄數據更新時間,同時表裏面要有 id 自動增加字段
3:以原庫名 c_001 , t_001 表爲例,以在目標服務器上建立存儲過程(以下是例程,要提高效率的話,還可以優化過程)
4:建立作業,定時調用存儲過程
Create PROCEDURE [dbo].[backup_001]
AS
BEGIN
SET NOCOUNT ON; SET IDENTITY_Insert t_001 ON
merge t_001 d
using
(SELECT * FROM OPENQUERY (xx2008 ,'select * from c_001.dbo.t_001' ) ) s
on (d.id=s.id and d.updatetime<>s.updatetime)
WHEN NOT MATCHED BY SOURCE THEN delete
when matched then
update set
d.f1=s.f1,
d.f2=s.f2,
d.f3=s.f3,
......
d.updatetime=s.updatetime
when not matched then
insert (d.f1,d.f2,d.f3,......d.updatetime)
values (s.f1,s.f2,s.f3,......s.updatetime);
SET IDENTITY_Insert t_001 OFF
END