备份和恢复是数据库管理员维护数据库安全性和完整性的重要操作虽然各种数据库系统本身提供了备份和恢复数据库的功能但是操作步骤比较烦琐本文以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_jobSp_end_job等同时要访问表sysjobhistory获取作业执行状态
执行体是作业执行的整体在应用系统投入使用时建立
控制体由用户触发启动相应的作业交由执行体执行在执行过程中执行体执行的每一步的状态信息都要写入MSDB数据库的sysjobhistory表里同时控制体不断获取执行状态信息根据这些信息控制体决定继续执行还是停止该作业在作业执行完毕或者出错停止后控制体向用户反馈执行结果
实现备份和恢复
为了便于说明本文以PB实现的一个具体系统为例来介绍数据库的备份和恢复
.执行体的建立
●建立应用系统的数据库XCCXXT
●建立备份数据库所使用的设备XCCXXTBAK
DAT
●建立备份作业XCCXXT BACKUP其中命令行为BACKUP DATABASE XCCXXT TO DISK=C\MSSQL\DATA\BACKUP\XCCXXTBAKDAT
.控制体的实现
在相应对象的备份按钮的click事件中写入以下代码
//声明相应的变量
string ls_databasels_passls_datels_time
integer li_gsli_gs_o
transaction login_trans
login_trans = create transaction
if messagebox(提示信息是否真的要进行数据备份操作?Exclamation!OKCancel!)〈〉 then return
//连接MSDB数据库
login_transdatabase = msdb
connect using login_trans;
if login_transsqlcode 〈〉 then
messagebox(数据库错误信息login_transsqlerrtext)
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_transautocommit = true
ls_pass = login_translogpass
//运行系统存储过程Sp_start_job启动执行体
prepare sqlsa from Sp_start_job ? using login_trans;
if login_transsqlcode 〈〉 then
messagebox(数据库错误信息login_transsqlerrtext)
login_transautocommit = false
disconnect using login_trans;
login_transdatabase = ls_database
return
end if
EXECUTE sqlsa USING XCCXXT BACKUP;
//检测执行体启动是否正常
if login_transsqlcode 〈〉 then
messagebox(数据库错误信息login_transsqlerrtext)
login_transautocommit = 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_transsqlcode 〈〉 then
messagebox(数据库错误信息login_transsqlerrtext)
login_transautocommit = false
disconnect using login_trans;
login_transdatabase = ls_database
return
end if
EXECUTE sqlsa USING XCCXXT BACKUP;
//返回执行结果
li_gs_o=li_gs -
select run_statusrun_daterun_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_transautocommit = false
disconnect using login_trans;
if login_transsqlcode 〈〉 then
messagebox(数据库错误信息login_transsqlerrtext)
end if
备份是对源数据库进行读操作执行体执行之前不需要检查用户对数据库的使用状态而恢复则是对整个数据库进行写操作在启动执行体之前一定要检查是否有数据库进行写操作否则可能导致失败
小结
作业机制打破了常规上在数据库管理器里对大型数据库备份和恢复的局限性实现了在应用程序客户端对数据库的备份和恢复