萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> sql server教程 >> 解決兩相同數據庫數據同步的問題

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

為用戶組建一套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


關鍵詞:

copyright © 萬盛學電腦網 all rights reserved