摘要:我以SQLSERVER為例,總結(jié)了實(shí)際工作中常用的幾種備份和恢復(fù)數(shù)據(jù)庫的實(shí)現(xiàn)方法,分析了作業(yè)機(jī)制的工作原理,并提出了一種以作業(yè)機(jī)制實(shí)現(xiàn)恢復(fù)和備份數(shù)據(jù)庫的切實(shí)可行的方法。用戶可以不打開數(shù)據(jù)庫管理器的情況下,使用應(yīng)用程序客戶端就可以方便地實(shí)現(xiàn)數(shù)據(jù)庫的備份和恢復(fù)。
關(guān)鍵詞:備份恢復(fù)作業(yè)機(jī)制數(shù)據(jù)庫
1.概述
備份和恢復(fù)數(shù)據(jù)庫是計(jì)算機(jī)管理員日常維護(hù)數(shù)據(jù)庫安全性和完整性的重要操作,也是計(jì)算機(jī)管理員所必需做的日常工作。備份可以防止表和數(shù)據(jù)庫遭受破壞、系統(tǒng)發(fā)生錯(cuò)誤或用戶操作錯(cuò)誤而造成數(shù)據(jù)災(zāi)難及時(shí)搶救恢復(fù)數(shù)據(jù),備份是恢復(fù)數(shù)據(jù)庫最容易和最能防止意外的保證方法。沒有備份,所有的數(shù)據(jù)隨時(shí)都有可能丟失,并使單位和計(jì)算機(jī)管理員遭受損失;謴(fù)是在數(shù)據(jù)庫遭到破壞或系統(tǒng)錯(cuò)誤發(fā)生后,利用備份數(shù)據(jù)來恢復(fù)數(shù)據(jù)庫的操作。
作為強(qiáng)大數(shù)據(jù)庫SQLSERVER的管理器ENTERPRISEMANAGER,本身提供了幾種實(shí)現(xiàn)和恢復(fù)數(shù)據(jù)庫的方法,但這幾種方法實(shí)現(xiàn)起來,都需要計(jì)算機(jī)管理員對ENTERPRISEMANAGER原理相當(dāng)熟悉,而且處理步驟相當(dāng)繁鎖,操作起來容易發(fā)生失誤。因此我們就需要一種更加簡便可行的實(shí)現(xiàn)方法。
2.常用的備份和恢復(fù)數(shù)據(jù)庫的方法
在SQLSERVERENTERPRISEMANAGER是一種強(qiáng)大的管理工具,它能完成很多功能,備份和恢復(fù)數(shù)據(jù)庫是其中的一項(xiàng)基本功能。歸納起來,借助這個(gè)管理工具有三種常用的方法實(shí)現(xiàn)備份和恢復(fù)數(shù)據(jù)庫。
、磐耆止し绞健T谶@種方式下,選擇要備份和恢復(fù)的數(shù)據(jù)庫,單擊鼠標(biāo)右鍵,在快捷菜單中的“ALLTASKS”下選擇備份或者恢復(fù)數(shù)據(jù)庫。這種方式,用戶要進(jìn)行很多步操作,其中要涉及到一些參數(shù),使用起來容易出錯(cuò),尤其對新手來講,一旦操作失誤可能帶來很大的數(shù)據(jù)損失。
、瓢胧止し绞健_@種方式就是計(jì)算機(jī)管理員事先建立備份或者恢復(fù)數(shù)據(jù)庫的作業(yè),待到備份或者恢復(fù)數(shù)據(jù)庫的時(shí)候,管理員打開“SQLSERVERENTEPRISEMANAGER”,在“MANAGER”里找到相應(yīng)的作業(yè),然后執(zhí)行之。這種方式,雖然是基于作業(yè)方式實(shí)現(xiàn)的,但是計(jì)算機(jī)管理員必須打開數(shù)據(jù)庫管理器,而且要在繁多的作業(yè)中進(jìn)行選擇。一旦選擇錯(cuò)誤并執(zhí)行后,也有可能帶來意想不到的損失。
、侨詣(dòng)方式。在數(shù)據(jù)庫管理器里面,計(jì)算機(jī)管理員事先建立好恢復(fù)或者備份數(shù)據(jù)庫的作業(yè),然后定制一個(gè)執(zhí)行計(jì)劃,讓計(jì)算機(jī)在特定的條件下完全靠自己執(zhí)行備份和恢復(fù)操作。這種方式看起來簡單、省事,但是計(jì)算機(jī)在意外情況之下,就不能按照你設(shè)定的計(jì)劃執(zhí)行了。
3.作業(yè)機(jī)制的工作原理
作業(yè)是ENTERPRISEMANAGER提供的一種定期處理數(shù)據(jù)的一種方法,前面提到的半手工方式和全自動(dòng)方式雖然利用了作業(yè),但它需要在ENTERPRISEMANAGER里啟動(dòng)和關(guān)閉作業(yè);我要研究討論的是在應(yīng)用程序客戶端啟動(dòng)和關(guān)閉作業(yè)的機(jī)制。我這里講的作業(yè)機(jī)制的工作原理,是由控制體和執(zhí)行體兩大部分構(gòu)成?刂企w顧名思義就是控制作業(yè)執(zhí)行的實(shí)體,靠具體編程實(shí)現(xiàn)。實(shí)現(xiàn)時(shí),要調(diào)用MSDB數(shù)據(jù)庫系統(tǒng)存儲(chǔ)過程SP_START_JOB,SP_END_JOB等等,同時(shí)要訪問表SYSJOBHITORY,獲取作業(yè)執(zhí)行狀態(tài)。
執(zhí)行體就是作業(yè)執(zhí)行的整體,應(yīng)用系統(tǒng)投入使用時(shí)建立。應(yīng)用系統(tǒng)安裝時(shí),要建立數(shù)據(jù)庫、備份和恢復(fù)設(shè)備、備份和恢復(fù)作業(yè)。
控制體由用戶觸發(fā),啟動(dòng)相應(yīng)的作業(yè),交由執(zhí)行體執(zhí)行作業(yè),在執(zhí)行過程中,執(zhí)行體執(zhí)行的每一步狀態(tài)信息都要寫入MSDB數(shù)據(jù)庫的SYSJOBHISTORY表里。同時(shí),控制體不斷獲取執(zhí)行狀態(tài)信息,根據(jù)這些信息,控制體決定繼續(xù)執(zhí)行還是停止該作業(yè)。在作業(yè)執(zhí)行完畢或者出錯(cuò)停止后,控制體向用戶反饋執(zhí)行結(jié)果。
4.以作業(yè)機(jī)制實(shí)現(xiàn)數(shù)據(jù)庫的備份和恢復(fù)
我為了便于解釋以POWERBUILDER實(shí)現(xiàn)的一個(gè)具體系統(tǒng)為示例,首先看一下數(shù)據(jù)庫備份的實(shí)現(xiàn)步驟。
4.1執(zhí)行體的建立
。1)建立應(yīng)用系統(tǒng)的數(shù)據(jù)庫XCCXXT。
。2)建立備份數(shù)據(jù)庫所使用的設(shè)備XCCXXTBAK.DAT。
。3)建立備份作業(yè)XCCXXTBACKUP,其中命令行為BACKUPDATABASEXCCXXTTODISK=“C:\MSSQL7\DATA\BACKUP\XCCXXTBAK.DAT”。
4.2控制體的實(shí)現(xiàn)
在相應(yīng)對象的“備份”按鈕的click事件中寫入以下代碼:
//聲明相應(yīng)的變量
stringls_database,ls_pass,ls_date,ls_time
integerli_gs,li_gs_o
transactionlogin_trans
login_trans=creattransaction
IFMessageBox("提示信息","是否真的要進(jìn)行數(shù)據(jù)備份操作?",&
Exclamation!,OKCancel!,2)<>1thenreturn
//連接MSDB數(shù)據(jù)庫
login_trans.database="msdb"
connectusinglogin_trans;
iflogin_trans.sqlcode<>0then
messagebox("數(shù)據(jù)庫錯(cuò)誤信息",login_trans.sqlerrtext)
return
endif
//檢測上次該執(zhí)行體執(zhí)行結(jié)果,用以區(qū)別本次執(zhí)行狀況
selectmax(instance_id)into:li_gs_ofromsysjobhistoryusinglogin_trans;
ifisnull(li_gs_o)thenli_gs_o=0
login_trans.autocommit=true
ls_pass=login_trans.logpass
//運(yùn)行系統(tǒng)存儲(chǔ)過程SP_START_JOB,啟動(dòng)執(zhí)行體
preparesqlsafrom"sp_start_job?"usinglogin_trans;
iflogin_trans.sqlcode<>0then
messagebox("數(shù)據(jù)庫錯(cuò)誤信息",login_trans.sqlerrtext)
login_trans.autocommit=false
disconnectusinglogin_trans;
login_trans.database=ls_database
return
endif
EXECUTEsqlsaUSING‘XCCXXTBACKUP’;
//檢測執(zhí)行體啟動(dòng)是否正常
iflogin_trans.sqlcode<>0then
messagebox("數(shù)據(jù)庫錯(cuò)誤信息",login_trans.sqlerrtext)
login_trans.autocommit=false
disconnectusinglogin_trans;
return
endif
//檢測執(zhí)行體執(zhí)行的整個(gè)過程
DO
uf_sleep(1)
selectmax(instance_id)into:li_gsfromsysjobhistoryusinglogin_trans;
ifisnull(li_gs)thenli_gs=0
LOOPWHILEli_gs<=li_gs_o+1
//運(yùn)行系統(tǒng)存儲(chǔ)過程SP_END_JOB,關(guān)閉執(zhí)行體
preparesqlsafrom"sp_end_job?"usinglogin_trans;
iflogin_trans.sqlcode<>0then
messagebox("數(shù)據(jù)庫錯(cuò)誤信息",login_trans.sqlerrtext)
login_trans.autocommit=false
disconnectusinglogin_trans;
login_trans.database=ls_database
return
endif
EXECUTEsqlsaUSING‘XCCXXTBACKUP’;
//返回執(zhí)行結(jié)果
li_gs_o=li_gs-1
selectrun_
----------------------------------------------
s,run_date,run_timeinto:li_gs,:ls_date,
:ls_timefromsysjobhistorywhereinstance_id=:li_gs_ousinglogin_trans;
ifli_gs=1then
st_3.text=left(ls_date,4)+’年’+mid(ls_date,5,2)+’月’
+right(ls_date,2)+’日’+’’+&
left(ls_time,2)+’:’+mid(ls_time,3,2)+’:’+right(ls_time,2)
messagebox(’提示’,"數(shù)據(jù)庫備份操作成功!")
else
messagebox(’提示’,"數(shù)據(jù)庫備份操作失!")
endif
//斷開與數(shù)據(jù)庫MSDB的連接
login_trans.autocommit=false
disconnectusinglogin_trans;
iflogin_trans.sqlcode<>0then
messagebox("數(shù)據(jù)庫錯(cuò)誤信息",login_trans.sqlerrtext)
endif
4.3備份數(shù)據(jù)庫
用戶單擊“備份”按鈕,系統(tǒng)就會(huì)備份XCCXXT數(shù)據(jù)庫。結(jié)束時(shí),會(huì)有相應(yīng)成功與否的信息向用戶提示。
備份是對數(shù)據(jù)庫的進(jìn)行讀操作,執(zhí)行體執(zhí)行之
轉(zhuǎn)載請注明來自:http://www.jinnzone.com/jisuanjiyingyonglw/1054.html