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