備份和恢復是數據庫管理員維護數據庫安全性和完整性的重要操作
雖然各種數據庫系統本身提供了備份和恢復數據庫的功能
但是操作步驟比較煩瑣
本文以SQL Server為例
總結了常用的幾種備份和恢復數據庫的方法
分析了作業機制的原理
並提出了一種以作業機制實現恢復和備份數據庫的方法
利用此方法
用戶不必打開數據庫管理器
在應用程序客戶端就可以方便地實現數據庫的備份和恢復
常用方法
備份可以防止由於表和數據庫遭受破壞
介質失效或用戶錯誤而造成的數據災難
恢復是在意外發生後
利用備份來恢復數據庫的操作
任何數據維護系統都必須具有備份和恢復數據庫的功能
SQL Server 的管理器Enterprise Manager是一個強大的管理工具
能完成很多功能
備份和恢復數據庫是其中的一項基本功能
借助這個管理工具有三種常用的方法實現備份和恢復數據庫
.完全手工方式
首先選擇要備份和恢復的數據庫
然後單擊鼠標右鍵
在快捷菜單中的
ALL TASKS
下選擇備份或者恢復數據庫
利用這種方式
用戶要進行多步操作
其中要涉及到一些參數的設置
使用起來容易出錯
而且一旦操作失誤可能帶來很大的損失
.半手工方式
這種方式要求管理員事先建立備份或者恢復數據庫的作業
待到需要備份或者恢復數據庫的時候
管理員打開
SQL Server Enterprise Manager
在
Manager
裡找到相應的作業
然後執行
這種方式雖然是基於作業方式實現的
但是管理員必須打開數據庫管理器
在繁多的作業中進行選擇
一旦選擇錯誤並執行
就有可能帶來意想不到的損失
.全自動方式
這種方式也要求管理員事先建立好恢復或者備份數據庫的作業
然後定制一個執行計劃
讓計算機在特定的條件下自己執行備份和恢復操作
這種方式看起來簡單
省事
但是機器在異常情況下(如掉電)
就不能按照計劃執行了
這幾種實現和恢復數據庫的方法都需要用戶對Enterprise Manager相當熟悉
而且處理步驟較為煩瑣
操作起來容易發生失誤
因此我們需要一種更加簡便可行的實現方法
作業機制的工作原理
作業是Enterprise Manager提供的一種定期處理數據的方法
可以在應用程序客戶端啟動和關閉
作業機制由控制體和執行體兩大部分構成(如圖
所示)
〈p align=
center
〉〈img src=
〉〈/p〉
控制體是控制作業執行的實體
靠具體編程實現
控制體實現時
要調用MSDB數據庫的系統存儲過程Sp_start_job
Sp_end_job等
同時要訪問表sysjobhistory
獲取作業執行狀態
執行體是作業執行的整體
在應用系統投入使用時建立
控制體由用戶觸發
啟動相應的作業
交由執行體執行
在執行過程中
執行體執行的每一步的狀態信息都要寫入MSDB數據庫的sysjobhistory表裡
同時
控制體不斷獲取執行狀態信息
根據這些信息
控制體決定繼續執行還是停止該作業
在作業執行完畢或者出錯停止後
控制體向用戶反饋執行結果
實現備份和恢復
為了便於說明
本文以PB實現的一個具體系統為例
來介紹數據庫的備份和恢復
.執行體的建立
●建立應用系統的數據庫XCCXXT
●建立備份數據庫所使用的設備XCCXXTBAK
DAT
●建立備份作業XCCXXT BACKUP
其中命令行為BACKUP DATABASE XCCXXT TO DISK=
C
\MSSQL
\DATA\BACKUP\XCCXXTBAK
DAT
.控制體的實現
在相應對象的
備份
按鈕的click事件中寫入以下代碼
//聲明相應的變量
string ls_database
ls_pass
ls_date
ls_time
integer li_gs
li_gs_o
transaction login_trans
login_trans = create transaction
if messagebox(
提示信息
是否真的要進行數據備份操作?
Exclamation!
OKCancel!
)〈〉
then return
//連接MSDB數據庫
login_trans
database =
msdb
connect using login_trans;
if login_trans
sqlcode 〈〉
then
messagebox(
數據庫錯誤信息
login_trans
sqlerrtext)
return
end if
//檢測上次該執行體執行結果
用以區別本次執行狀況
select max(instance_id) into :li_gs_o from sysjobhistory using login_trans;
if isnull(li_gs_o) then li_gs_o =
login_trans
autocommit = true
ls_pass = login_trans
logpass
//運行系統存儲過程Sp_start_job
啟動執行體
prepare sqlsa from
Sp_start_job ?
using login_trans;
if login_trans
sqlcode 〈〉
then
messagebox(
數據庫錯誤信息
login_trans
sqlerrtext)
login_trans
autocommit = false
disconnect using login_trans;
login_trans
database = ls_database
return
end if
EXECUTE sqlsa USING
XCCXXT BACKUP
;
//檢測執行體啟動是否正常
if login_trans
sqlcode 〈〉
then
messagebox(
數據庫錯誤信息
login_trans
sqlerrtext)
login_trans
autocommit = false
disconnect using login_trans;
return
end if
//檢測執行體執行的整個過程
do
uf_sleep (
)
select max(instance_id) into :li_gs from sysjobhistory
using login_trans;
if isnull(li_gs) then li_gs =
loop while li_gs〈=li_gs_o+
//運行系統存儲過程Sp_end_job
關閉執行體
prepare sqlsa from
Sp_end_job ?
using login_trans;
if login_trans
sqlcode 〈〉
then
messagebox(
數據庫錯誤信息
login_trans
sqlerrtext)
login_trans
autocommit = false
disconnect using login_trans;
login_trans
database = ls_database
return
end if
EXECUTE sqlsa USING
XCCXXT BACKUP
;
//返回執行結果
li_gs_o=li_gs -
select run_status
run_date
run_time into :li_gs
:ls_date
:ls_time from sysjobhistory where instance_id =:li_gs_o using login_trans;
if li_gs =
then
st_
text = left(ls_date
)+
年
+mid(ls_date
)+
月
+right(ls_date
)+
日
+
+ left(ls_time
)+
:
+mid(ls_time
)+
:
+right(ls_time
)
messagebox(
提示
數據庫備份操作成功!
)
else
messagebox(
提示
數據庫備份操作失敗!
)
end if
//斷開與數據庫MSDB的連接
login_trans
autocommit = false
disconnect using login_trans;
if login_trans
sqlcode 〈〉
then
messagebox(
數據庫錯誤信息
login_trans
sqlerrtext)
end if
備份是對源數據庫進行讀操作
執行體執行之前不需要檢查用戶對數據庫的使用狀態
而恢復則是對整個數據庫進行寫操作
在啟動執行體之前一定要檢查是否有數據庫進行寫操作
否則可能導致失敗
小結
作業機制打破了常規上在數據庫管理器裡對大型數據庫備份和恢復的局限性
實現了在應用程序客戶端對數據庫的備份和恢復
From:http://tw.wingwit.com/Article/program/Oracle/201311/18228.html