筆者是在山東濰坊出差時,遇到了使用者要求的提供雙機熱備份功能,
最終的解決方案是:
在主服器上執行同步程式(用bcb5.0編寫的程式),同步程式在啟動時,在sql server 中建立跟蹤過程,跟蹤過程將跟蹤到的sql 語句存放在主伺服器的跟蹤表中;
同步程式每隔半分鐘訪問跟蹤表,將其中的sql 語句傳送到備份伺服器,並將其刪除!
query1 -> close(); //query1 為 tadoquery的元件
//實驗中發現若用bde中的tquery元件,對跟蹤到的
//image型別資料會操作時會發生錯誤.
query1 -> sql -> clear();
tstrings *psql = query1 -> sql;
//設定sql 語句的過濾條件,可設定成" update%;delete%;insert%",則只跟蹤update
// insert 和 delete語句
wsprintf( tempbuf,"exec xp_trace_settextfilter @queue_handle,'%s',null", sqlfilter.c_str());
psql -> add(ansistring(tempbuf));
//設定將跟蹤到的資訊存放在哪個表裡 ,
//如果表不存在,則自動建立,表的列數由前面的@colomun_value控制.
// 為以後方便讀出控制,可以在自動建立了這個表後,手工的為其加上id欄位(自動增長字段),
// 並做為主索引.
wsprintf( tempbuf,
"exec xp_trace_setqueuedestination @queue_handle,4,1,null,'%s'",
dsttable.c_str()
);psql -> add( ansistring(tempbuf));
// 開始跟蹤
psql -> add("exec xp_trace_startconsumer @queue_handle");
psql -> add("select @queue_handle queuehandle");
// 將批命令提交到sql server, 執行完畢後,跟蹤過程就建立起來了
trycatch(...)
tracehandle = query1 -> fieldbyname("queuehandle") -> asinteger;
return true;
}//呼叫過程
...int tracehandle
int dbid;
dbid = getdbid("mydb1"); //根據資料庫名從sql server的sysdatabases中查詢dbid
解決兩相同資料同步的問題
為使用者組建一套應用系統時,使用者經常提到這樣的要求 如果其中一台伺服器壞了,怎樣才能防止資料丟失,並在最短的時間內恢復系統?要解決這個問題,肯定需要兩台伺服器,並在兩台伺服器上裝有相同的資料庫,保持兩台伺服器中的資料同步,當主伺服器壞了時,將另外一台伺服器更改一下計算機名稱,從而使得工作站可以繼續...
解決主從資料庫同步延遲問題
場景 需要在主機寫入之後,保證在備機一定能夠讀取到已經寫入的資料,也就是需要主從架構下的強一致性。主機與備機之間的物理延遲是不可控的,也是無法避免的。但是如果僅僅需要滿足這種強一致性,是相對簡單的事情 只需要在主機寫入時,確認更新已經同步到備機之後,再返回寫操作成功即可。主從資料庫支援這種完全的同步...
同步兩個資料庫
同步兩個資料庫的示例 有資料 srv1.庫名.author有欄位 id,name,phone,srv2.庫名.author有欄位 id,name,telphone,adress 要求 srv1.庫名.author增加記錄則srv1.庫名.author記錄增加 srv1.庫名.author的phone...