程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 解決兩相同數據庫數據同步的問題

解決兩相同數據庫數據同步的問題

編輯:關於SqlServer

為用戶組建一套SQL Server應用系統時,用戶經常提到這樣的要求:

如果其中一台服務器壞了,怎樣才能防止數據丟失,並在最短的時間內恢復系統?

要解決這個問題,肯定需要兩台服務器,並在兩台服務器上裝有相同的數據庫,保持兩台服務器中的數據同步,當主服務器壞了時,將另外一台服務器更改一下計算機名稱,從而使得工作站可以繼續運行.

那麼如何保持兩台數據庫中的數據同步呢? SQL Server提供了出版-定閱機制,可以將數據實時的拷貝到定閱服務器中. 但在實際應用中,發現一旦建立起了出版-定閱關系,在定閱服務器數據庫中的觸發器,主鍵等東西都不見了!!! 當主服務器不能正常工作時,要想讓另一台服務器轉變為主服務器,除更改計算機名外,還需建立觸發器,索引等,過程比較煩瑣.特別當用戶對數據庫維護不熟悉時,這種操作更加麻煩.

SQL Server做為一種數據庫管理系統,它與客戶的接口都是通過SQL語句進行的, 用戶在插入一條記錄時,SQL Server會接收到Insert語句;更改一條記錄時,會接收到 Update命令...
那麼如果我們能在SQL Server中跟蹤到所有發給SQL Server的SQL語句,那麼我們就可以知道數據庫發生了哪些改變,並可以將這種改變發給另外一到服務器,從而實現數據實時同步的功能.

值得高興的是,SQL Server 提供了跟蹤功能 ,它們是以 xp_trace_XXXXXX的一系列存儲過程,
你可以設置過濾條件,從而只跟蹤影響你的數據庫 變化的SQL 語句,將這些SQL 語句存放在本地表中,再從本地表中讀出,發送給另外一台服務器 ,從而實現數據同步功能. 這種方法可以跟蹤任何類型的變化,包括Image類型數據的改變.

以下面是用BCB5.0語句實現建立跟蹤過程:
bool TForm1 :: BuildTrace(int DBID,
AnsiString AppFilter,
AnsiString SQLFilter,
AnsiString DstTable,
int &TraceHandle)
{
char tempBuf[512];

Query1 -> Close();
Query1 -> SQL -> Clear();
TStrings *pSQL = Query1 -> SQL;


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));

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,4,1,NULL,'%s'",

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved