WebService同步兩台遠程SQLSERVER2000數據庫
徐龍 2007-12-13
Sqlserver2000對於數據庫的同步內部提供了多種方法,但是由於兩台服務器分別在中國和美國.
如果直接運用SqlServer2000的內建同步機制,勢必要將兩台服務器暴露在internet之下,出於對網絡安全和網絡帶寬的考慮,首先否定此種辦法。
我采用的方法是通過在源服務器裡加入 trace ,將源服務器中對數據庫內容變動的所有sql語句都統一記錄下來。然後在WEB服務器上部署webservice,目標服務器端可以通過一個winform程序調用(按同步要求定時執行)webservice取得所有sql語句,然後在目的服務器中將sql回放執行,從而達到兩端數據庫同步的功能.(如下圖)
如此以來不必暴露sqlserver,提高了數據的發全性,采用webservice 可以工作在80端口,對防火牆沒有特殊要求,同步設置上更加靈活(當然對於webservice要采取適當保護措施,傳輸過程中數據要全程加密。)。
OK,現在的問題是如何在源服務器裡加入 trace ,得到服務器所有執行過的sql語句,我們都知道SQLSERVER 有個工具 profiler,我們經常都會使用它觀察sql執行情況,做性能調校等。通過對它的研究我找到了幾個內部函數打破難題,成功實現了這個方案.
sp_trace_create //建立一個跟蹤,並能設置選項,但是它保存在一個文件裡
::fn_trace_gettable //通過這個方法可以解析跟蹤保存的文件
::fn_trace_getinfo //獲取服務器中的trace資料
sp_procoption //注冊函數能在數據庫服務器啟動時就運行
下面我貼出完整的跟蹤記錄的SQL代碼,至於webservice和winform的程序我就不詳細介紹了,基
本上比較容易實現
以下代碼在sql2000運行正常
------------------------------------------------------------------------------------------------------------
Use master
/*
功能:結束之前已有的追蹤
author: 徐龍
Date: 2005/07/09
Email: [email protected]
*/
Declare @tmpTraceId int
Declare @i int
set @i=1
while @i<10
begin
set @tmpTraceId=@i
exec sp_trace_setstatus @tmpTraceId,