為用戶組建一套SQL Server應用系統時
用戶經常提到這樣的要求:
如果其中一台服務器壞了
怎樣才能防止數據丟失
並在最短的時間內恢復系統?
要解決這個問題
肯定需要兩台服務器
並在兩台服務器上裝有相同的數據庫
保持兩台服務器中的數據同步
當主服務器壞了時
將另外一台服務器更改一下計算機名稱
從而使得工作站可以繼續運行
那麼如何保持兩台數據庫中的數據同步呢? SQL Server提供了出版
定閱機制
可以將數據實時的拷貝到定閱服務器中
但在實際應用中
發現一旦建立起了出版
定閱關系
在定閱服務器數據庫中的觸發器
主鍵等東西都不見了!!! 當主服務器不能正常工作時
要想讓另一台服務器轉變為主服務器
除更改計算機名外
還需建立觸發器
索引等
過程比較煩瑣
特別當用戶對數據庫維護不熟悉時
這種操作更加麻煩
Sql Server做為一種數據庫管理系統
它與客戶的接口都是通過SQL語句進行的
用戶在插入一條記錄時
SQL Server會接收到Insert語句;更改一條記錄時
會接收到 Update命令
那麼如果我們能在SQL Server中跟蹤到所有發給SQL Server的SQL語句
那麼我們就可以知道數據庫發生了哪些改變
並可以將這種改變發給另外一到服務器
從而實現數據實時同步的功能
值得高興的是
SQL Server 提供了跟蹤功能
它們是以 xp_trace_XXXXXX的一系列存儲過程
你可以設置過濾條件
從而只跟蹤影響你的數據庫 變化的SQL 語句
將這些SQL 語句存放在本地表中
再從本地表中讀出
發送給另外一台服務器
從而實現數據同步功能
這種方法可以跟蹤任何類型的變化
包括Image類型數據的改變
以下面是用BCB
語句實現建立跟蹤過程:
bool TForm
:: BuildTrace(int DBID
AnsiString AppFilter
AnsiString SQLFilter
AnsiString DstTable
int &TraceHandle)
{
char tempBuf[
];
Query
> Close();
Query
> SQL
> Clear();
TStrings *pSQL = Query
> SQL;
pSQL
> Add(
USE master
);
pSQL
> Add(
DECLARE @queue_handle int
);
pSQL
> Add(
DECLARE @column_value int
);
pSQL
> Add(
SET @column_value =
|
|
|
|
);
pSQL
> Add(
EXEC xp_trace_addnewqueue
@column_value
@queue_handle OUTPUT
);
pSQL
> Add(
EXEC xp_trace_seteventclassrequired @queue_handle
);
wsprintf(tempBuf
EXEC xp_trace_setappfilter @queue_handle
%s
NULL
AppFilter
c_str());
pSQL
> Add(AnsiString(tempBuf));
wsprintf(tempBuf
EXEC xp_trace_setdbidfilter @queue_handle
%d
DBID);
pSQL
> Add( AnsiString(tempBuf));
wsprintf( tempBuf
Exec xp_trace_settextfilter @queue_handle
%s
NULL
SQLFilter
c_str());
pSQL
> Add(AnsiString(tempBuf));
wsprintf( tempBuf
EXEC xp_trace_setqueuedestination @queue_handle
NULL
%s
DstTable
c_str()
);
pSQL
> Add( AnsiString(tempBuf));
pSQL
> Add(
EXEC xp_trace_startconsumer @queue_handle
);
pSQL
> Add(
SELECT @queue_handle QueueHandle
);
try
{
Query
> Open();
}
catch(
)
{
return false;
}
TraceHandle = Query
> FieldByName(
QueueHandle
)
> AsInteger;
return true;
}
From:http://tw.wingwit.com/Article/Fault/201311/10382.html