C 可定製的資料庫備份和恢復程式

2021-03-31 08:56:28 字數 2850 閱讀 2106

可定製的資料庫備份和恢復程式 tashanzhishi [原作]

關鍵字 資料庫 備份 恢復

出處 在我們做資料庫系統的程式時,經常需要為客戶做乙個資料庫的備份和恢復程式,特別是對於一些非專業的資料庫使用者,這個程式更是必不可少,而且操作必需足夠簡單。因為在很多系統中,資料庫的備份恢復功能都是相近的,因此,我們最好做乙個通用的資料庫備份恢復程式,這樣就不必每個系統都開發一套了。

要開發這樣一套系統,我個人認為應該滿足以下要求:

1. 備份恢復操作應該有歷史記錄(必需有乙個備份列表,列出備份檔案的相關資訊),便於使用者查詢以往的備份。

2. 對於每一次備份和恢復應允許使用者記錄備份和恢復的原因。

3. 系統應允許使用者進行簡單的配置,並且配置可以儲存。

4. 備份和恢復應該足夠簡單,最好類似與檔案的複製,對於已經進行的備份,應允許使用者從備份列表恢復。

5. 即使因為某種原因使要恢復的資料庫正在占用,也應該允許使用者恢復(這一點很重要,因為你不能指望使用者自己保證資料庫的獨占性)。

6. 實時顯示備份或恢復的當前進度。

要達到以上的要求,我想我們應該這樣設計系統:

1. 對於每一次的資料庫備份和恢復,我們都記下當時的資料庫伺服器名,資料庫名,備份檔案全路徑名,備份時間,進行備份或恢復的原因等資訊,並把這些資訊以xml的形式儲存,下面是我得乙個備份檔案例項:

<?xml version="1.0" encoding="gb2312"?>

20040205 10:41:21

hrmjx4

測試備份

e:/ricatex2003.bak

20040205 10:43:58

hrmjx4

每週例行備份

e:/hrmjx4040205.bak20.

book

sa2iuc94tkpsg=

上面依次記錄了備份程式的名稱(顯示在備份窗體的標題欄,無實際用處),備份歷史最大記錄數,備份的資料庫伺服器名稱,備份的資料庫名稱,使用者名稱,密碼(已經過加密)等資訊。我們在程式剛開始啟動時,就自動把這些資訊應用到使用者介面上去,這樣就不用使用者重新設定了。

3. 備份時我們採取直接備份到檔案的方法,使用者只需使用儲存檔案對話方塊指定要備份的位置和檔名即可,其餘的工作通過程式完成,恢復也一樣,只需通過開啟檔案對話方塊指定從其中恢復的檔案即可。

4. 我們在恢復時,先殺死要恢復的資料庫所關聯的所有使用者執行緒,然後再進行恢復,這樣就不會存在因為資料庫獨占性引起的恢復錯誤。

5. 對於實時顯示備份和恢復的進度問題,我們採取sql-dmo的**函式的方式實現。

2. 資料庫的備份和實時進度顯示**:

public bool backupdb(string strdbname,string strfilename, progressbar pgbmain)

catch(exception err)

finally }

private void step(string message,int percent)

其中,這兩個語句實現了進度的實時顯示:

sqldmo.backupsink_percent***pleteeventhandler pceh = new sqldmo.backupsink_percent***pleteeventhandler(step);

bak.percent***plete += pceh;

step就是上面private void step(string message,int percent) 的方法名稱,它用來顯示進度條的當前進度。

3. 資料庫的恢復和殺死程序的**:

public bool restoredb(string strdbname,string strfilename, progressbar pgbmain)

else if (strname.toupper().trim() == "dbname")

if (icolpidnum != -1 && icoldbname != -1)

break ;

} for(int i=1;i<=qr.rows;i++)

sqldmo.restore res = new sqldmo.restoreclass() ;

res.action = 0 ;

sqldmo.restoresink_percent***pleteeventhandler pceh = new sqldmo.restoresink_percent***pleteeventhandler(step);

res.percent***plete += pceh;

res.files = strfilename ;

res.database = strdbname ;

res.replacedatabase = true ;

res.sqlrestore(svr) ;

return true ;

} catch(exception err)

finally }

其中這個語句取得了所有的程序列表:

sqldmo.queryresults qr = svr.enumprocesses(-1) ;

下面的語句找到和要恢復資料庫相關的程序並殺死:

int icolpidnum = -1 ;

int icoldbname = -1 ;

for(int i=1;i<=qr.columns;i++)

else if (strname.toupper().trim() == "dbname")

if (icolpidnum != -1 && icoldbname != -1)

break ;

} for(int i=1;i<=qr.rows;i++)

C 可定製的資料庫備份和恢復程式

可定製的資料庫備份和恢復程式 tashanzhishi 原作 關鍵字 資料庫 備份 恢復 出處 在我們做資料庫系統的程式時,經常需要為客戶做乙個資料庫的備份和恢復程式,特別是對於一些非專業的資料庫使用者,這個程式更是必不可少,而且操作必需足夠簡單。因為在很多系統中,資料庫的備份恢復功能都是相近的,因...

C 可定製的資料庫備份和恢復程式

可定製的資料庫備份和恢復程式 tashanzhishi 原作 關鍵字 資料庫 備份 恢復 出處 在我們做資料庫系統的程式時,經常需要為客戶做乙個資料庫的備份和恢復程式,特別是對於一些非專業的資料庫使用者,這個程式更是必不可少,而且操作必需足夠簡單。因為在很多系統中,資料庫的備份恢復功能都是相近的,因...

C 可定製的資料庫備份和恢復程式

可定製的資料庫備份和恢復程式 tashanzhishi 原作 關鍵字 資料庫 備份 恢復 出處 在我們做資料庫系統的程式時,經常需要為客戶做乙個資料庫的備份和恢復程式,特別是對於一些非專業的資料庫使用者,這個程式更是必不可少,而且操作必需足夠簡單。因為在很多系統中,資料庫的備份恢復功能都是相近的,因...