亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

帶你輕松接觸一個數據庫的備份和恢復程序

2024-07-21 02:44:04
字體:
來源:轉載
供稿:網友

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


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

◆1.備份恢復操作應該有歷史記錄(必需有一個備份列表,列出備份文件的相關信息),便于用戶查找以往的備份。

◆2. 對于每一次備份和恢復應允許用戶記錄備份和恢復的原因。

◆3.系統應允許用戶進行簡單的配置,并且配置可以保存。

◆4.備份和恢復應該足夠簡單,最好類似與文件的復制,對于已經進行的備份,應允許用戶從備份列表恢復。

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

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

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

◆1.對于每一次的數據庫備份和恢復,我們都記下當時的數據庫服務器名,數據庫名,備份文件全路徑名,備份時間,進行備份或恢復的原因等信息,并把這些信息以xml的形式保存,下面是我得一個備份文件實例:

 


20040205 10:41:21

hrmjx4

測試備份

E:/ricatex2003.bak

 

20040205 10:43:58

hrmjx4

每周例行備份

E:/hrmjx4040205.bak

 

◆2.對于用戶的配置可以這樣進行:

 

數據庫備份

20

.

book

sa

2iUc94tkpsg=


上面依次記錄了備份程序的名稱(顯示在備份窗體的標題欄,無實際用處),備份歷史最大記錄數,備份的數據庫服務器名稱,備份的數據庫名稱,用戶名,密碼(已經過加密)等信息。我們在程序剛開始啟動時,就自動把這些信息應用到用戶界面上去,這樣就不用用戶重新設置了。

3.備份時我們采取直接備份到文件的方法,用戶只需使用保存文件對話框指定要備份的位置和文件名即可,其余的工作通過程序完成,恢復也一樣,只需通過打開文件對話框指定從其中恢復的文件即可。

4.我們在恢復時,先殺死要恢復的數據庫所關聯的所有用戶線程,然后再進行恢復,這樣就不會存在因為數據庫獨占性引起的恢復錯誤。

5.對于實時顯示備份和恢復的進度問題,我們采取SQL-DMO的回調函數的方式實現。


下面是相關技術難點的代碼實現(因為個人的喜好,在此已C#的代碼形式實現):

◆1.在用戶的配置時,我們需要列出當前局域網內所有的數據庫服務器,并且要列出指定服務器的所有數據庫,實現代碼如下:

取得數據庫服務器列表:

public ArrayList GetServerList()

{

ArrayList alServers = new ArrayList() ;

SQLDMO.application sqlApp = new SQLDMO.ApplicationClass() ;

try

{

SQLDMO.NameList serverList = sqlApp.ListAvailableSQLServers() ;

for(int i = 1;i<= serverList.Count;i++)

{

alServers.Add(serverList.Item(i)) ;

}

}

catch(Exception e)

{

throw(new Exception("取數據庫服務器列表出錯:"+e.Message)) ;

}

finally

{

sqlApp.Quit() ;

}

return alServers ;

}

取得指定數據庫服務器的數據庫列表

public ArrayList GetDbList(string strServerName,string strUserName,string strPwd)

{

ServerName = strServerName ;

UserName = strUserName ;

PassWord = strPwd ;


ArrayList alDbs = new ArrayList() ;

SQLDMO.Application sqlApp = new SQLDMO.ApplicationClass() ;

SQLDMO.SQLServer svr = new SQLDMO.SQLServerClass() ;

try

{

svr.Connect(ServerName,UserName,Password) ;

foreach(SQLDMO.Database db in svr.Databases)

{

if(db.Name!=null)

alDbs.Add(db.Name) ;

}

}

catch(Exception e)

{

throw(new Exception("連接數據庫出錯:"+e.Message)) ;

}

finally

{

svr.DisConnect() ;

sqlApp.Quit() ;

}

return alDbs ;

}


◆2.數據庫的備份和實時進度顯示代碼:

public bool BackUPDB(string strDbName,string strFileName, PRogressBar pgbMain)

{

PBar = pgbMain ;

SQLDMO.SQLServer svr = new SQLDMO.SQLServerClass() ;

try

{

svr.Connect(ServerName,UserName,Password) ;

SQLDMO.Backup bak = new SQLDMO.BackupClass();

bak.Action = 0 ;

bak.Initialize = true ;

SQLDMO.BackupSink_PercentCompleteEventHandler pceh = new SQLDMO.BackupSink_PercentCompleteEventHandler(Step);

bak.PercentComplete += pceh;


bak.Files = strFileName;

bak.Database = strDbName;

bak.SQLBackup(svr);

return true ;

}

catch(Exception err)

{

throw(new Exception("備份數據庫失敗"+err.Message)) ;

}

finally

{

svr.DisConnect() ;

}

}


private void Step(string message,int percent)

{

PBar.Value = percent ;

}

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

SQLDMO.BackupSink_PercentCompleteEventHandler pceh = new SQLDMO.BackupSink_PercentCompleteEventHandler(Step);

bak.PercentComplete += pceh;

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


◆3.數據庫的恢復和殺死進程的代碼:

public bool RestoreDB(string strDbName,string strFileName, ProgressBar pgbMain)

{

PBar = pgbMain ;

SQLDMO.SQLServer svr = new SQLDMO.SQLServerClass() ;

try

{

svr.Connect(ServerName,UserName,Password) ;

SQLDMO.QueryResults qr = svr.EnumProcesses(-1) ;

int iColPIDNum = -1 ;

int iColDbName = -1 ;

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

{

string strName = qr.get_ColumnName(i) ;

if (strName.ToUpper().Trim() == "SPID")

{

iColPIDNum = i ;

}

else if (strName.ToUpper().Trim() == "DBNAME")

{

iColDbName = i ;

}

if (iColPIDNum != -1 && iColDbName != -1)

break ;

}


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

{

int lPID = qr.GetColumnLong(i,iColPIDNum) ;

string strDBName = qr.GetColumnString(i,iColDbName) ;

if (strDBName.ToUpper() == strDbName.ToUpper())

svr.KillProcess(lPID) ;

}


SQLDMO.Restore res = new SQLDMO.RestoreClass() ;

res.Action = 0 ;

SQLDMO.RestoreSink_PercentCompleteEventHandler pceh = new SQLDMO.RestoreSink_PercentCompleteEventHandler(Step);

res.PercentComplete += pceh;

res.Files = strFileName ;


res.Database = strDbName ;

res.ReplaceDatabase = true ;

res.SQLRestore(svr) ;

return true ;

}

catch(Exception err)

{

throw(new Exception("恢復數據庫失敗,請關閉所有和該數據庫連接的程序!"+err.Message)) ;

}

finally

{

svr.DisConnect() ;

}

}


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

SQLDMO.QueryResults qr = svr.EnumProcesses(-1) ;

下面的語句找到和要恢復數據庫相關的進程并殺死:

int iColPIDNum = -1 ;

int iColDbName = -1 ;

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

{

string strName = qr.get_ColumnName(i) ;

if (strName.ToUpper().Trim() == "SPID")

{

iColPIDNum = i ;

}

else if (strName.ToUpper().Trim() == "DBNAME")

{

iColDbName = i ;

}

if (iColPIDNum != -1 && iColDbName != -1)

break ;

}


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

{

int lPID = qr.GetColumnLong(i,iColPIDNum) ;

string strDBName = qr.GetColumnString(i,iColDbName) ;

if (strDBName.ToUpper() == strDbName.ToUpper())

svr.KillProcess(lPID) ;

}

 

以上就是數據庫備份和恢復的關鍵代碼,有了這些代碼,我們實現更完善的數據庫備份恢復功能也是沒問題的,比如,你可以很容易的實現定時備份或按照一定的循環策略進行備份。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国内精久久久久久久久久人| 在线观看日韩视频| 国产精品永久免费在线| 国产成人高潮免费观看精品| 日韩精品欧美国产精品忘忧草| 国产精品国产三级国产aⅴ9色| 国产69精品久久久久9999| 2021久久精品国产99国产精品| 最新69国产成人精品视频免费| 国产中文字幕91| 麻豆国产精品va在线观看不卡| 亚洲一区中文字幕| 亚洲精品久久视频| 亚洲精品国产精品国产自| 欧洲永久精品大片ww免费漫画| 欧美有码在线观看| 午夜精品福利在线观看| 色婷婷**av毛片一区| 亚洲aⅴ日韩av电影在线观看| 日韩极品精品视频免费观看| 国产在线999| 国模精品系列视频| 97婷婷大伊香蕉精品视频| 日韩福利在线播放| 久久久久久一区二区三区| 国产成人一区二区| 久久精品99国产精品酒店日本| 亚洲免费高清视频| 久久精品国产v日韩v亚洲| www.日本久久久久com.| 日韩有码在线电影| 久久久成人av| 亚洲欧洲高清在线| 亚洲人成网站色ww在线| 77777少妇光屁股久久一区| 乱亲女秽乱长久久久| 疯狂做受xxxx高潮欧美日本| 日韩经典第一页| 中文字幕日韩专区| 一本大道久久加勒比香蕉| 中文字幕国产日韩| 2018日韩中文字幕| 欧美另类精品xxxx孕妇| 成人国产亚洲精品a区天堂华泰| 色婷婷综合久久久久| 亚洲最大的免费| 中文字幕少妇一区二区三区| 精品国产999| 国产日韩欧美综合| 91国内产香蕉| 爱福利视频一区| 欧美黑人极品猛少妇色xxxxx| 亚洲成人av资源网| 欧美一级视频在线观看| 色偷偷91综合久久噜噜| 97超级碰碰碰久久久| 伊人一区二区三区久久精品| 亚洲香蕉av在线一区二区三区| 国产美女91呻吟求| 国产成人a亚洲精品| 亚洲欧美制服中文字幕| 亚洲激情视频网| 亚洲热线99精品视频| 国产亚洲精品91在线| 欧美成在线观看| 亚洲精品不卡在线| 国产精品视频999| 国产精品三级在线| 色偷偷av亚洲男人的天堂| 日韩av免费观影| 日韩精品视频在线播放| 欧美综合在线第二页| 超在线视频97| 亚洲毛片在线观看.| 国产精品成人一区二区三区吃奶| 欧美刺激性大交免费视频| 亚洲天堂av在线播放| 欧美视频中文在线看| 国产91色在线|| 欧美色道久久88综合亚洲精品| 久久久久久久久电影| 日韩av在线最新| 日韩视频亚洲视频| 成人午夜高潮视频| 亚洲性视频网站| 91精品久久久久久久久| 日韩影视在线观看| 国产偷亚洲偷欧美偷精品| 亚洲一区二区三区四区在线播放| 久久精品国产欧美亚洲人人爽| 日韩精品视频免费在线观看| 欧美性猛交xxxx乱大交极品| 日韩亚洲欧美成人| 国产精品最新在线观看| 中文字幕亚洲无线码在线一区| 欧美高清不卡在线| 92看片淫黄大片看国产片| 日韩视频中文字幕| 久久夜色精品亚洲噜噜国产mv| 亚洲精品日韩欧美| 欧美激情二区三区| 久久中国妇女中文字幕| 欧美电影免费观看高清| 亚洲欧美精品伊人久久| 亚洲在线观看视频网站| 日本午夜精品理论片a级appf发布| 精品成人69xx.xyz| 欧美国产亚洲精品久久久8v| 国产成人精品999| 欧美午夜丰满在线18影院| 欧美激情一区二区三级高清视频| 国产精品亚洲综合天堂夜夜| 精品国产欧美一区二区三区成人| 97视频免费在线看| 国产精品久久久久秋霞鲁丝| 国产日韩精品在线播放| 日韩中文字幕免费视频| 国产精品视频播放| 久久久久亚洲精品成人网小说| 91国内产香蕉| 日韩欧美在线网址| 日韩一区二区三区在线播放| 亚洲第一偷拍网| 欧美日本中文字幕| 日本不卡高字幕在线2019| 在线成人一区二区| 国产精品视频免费在线观看| 欧美性生交xxxxx久久久| 91精品国产自产在线观看永久| 色婷婷亚洲mv天堂mv在影片| 精品视频—区二区三区免费| 亚洲一区二区三区xxx视频| 欧美成人精品不卡视频在线观看| 51ⅴ精品国产91久久久久久| 在线日韩第一页| 久青草国产97香蕉在线视频| 奇米成人av国产一区二区三区| 国产精品久久97| 欧美在线精品免播放器视频| 国产脚交av在线一区二区| 色综合久久天天综线观看| 亚洲国产福利在线| 久久免费视频在线| 亚洲国产精品小视频| 久久伊人91精品综合网站| 亚洲欧美精品伊人久久| 北条麻妃在线一区二区| 永久免费看mv网站入口亚洲| 久久天天躁狠狠躁夜夜av| 色哟哟入口国产精品| 国产日韩在线看片| 在线视频日韩精品| 亚洲老板91色精品久久| 亚洲区在线播放| 国产69精品久久久久99| 68精品久久久久久欧美| 久久777国产线看观看精品| 538国产精品视频一区二区| 久久精品电影网| 久久91精品国产91久久久| 91在线色戒在线| 亚洲精美色品网站| 久久久久五月天| 精品成人乱色一区二区|