2010客户端备份和恢复MSSQL Server数据库
所属栏目:计算机应用论文
发布时间:2011-02-24 11:04:57 更新时间:2011-02-24 11:04:57
摘要:我以SQLSERVER为例,总结了实际工作中常用的几种备份和恢复数据库的实现方法,分析了作业机制的工作原理,并提出了一种以作业机制实现恢复和备份数据库的切实可行的方法。用户可以不打开数据库管理器的情况下,使用应用程序客户端就可以方便地实现数据库的备份和恢复。
关键词:备份恢复作业机制数据库
1.概述
备份和恢复数据库是计算机管理员日常维护数据库安全性和完整性的重要操作,也是计算机管理员所必需做的日常工作。备份可以防止表和数据库遭受破坏、系统发生错误或用户操作错误而造成数据灾难及时抢救恢复数据,备份是恢复数据库最容易和最能防止意外的保证方法。没有备份,所有的数据随时都有可能丢失,并使单位和计算机管理员遭受损失。恢复是在数据库遭到破坏或系统错误发生后,利用备份数据来恢复数据库的操作。
作为强大数据库SQLSERVER的管理器ENTERPRISEMANAGER,本身提供了几种实现和恢复数据库的方法,但这几种方法实现起来,都需要计算机管理员对ENTERPRISEMANAGER原理相当熟悉,而且处理步骤相当繁锁,操作起来容易发生失误。因此我们就需要一种更加简便可行的实现方法。
2.常用的备份和恢复数据库的方法
在SQLSERVERENTERPRISEMANAGER是一种强大的管理工具,它能完成很多功能,备份和恢复数据库是其中的一项基本功能。归纳起来,借助这个管理工具有三种常用的方法实现备份和恢复数据库。
⑴完全手工方式。在这种方式下,选择要备份和恢复的数据库,单击鼠标右键,在快捷菜单中的“ALLTASKS”下选择备份或者恢复数据库。这种方式,用户要进行很多步操作,其中要涉及到一些参数,使用起来容易出错,尤其对新手来讲,一旦操作失误可能带来很大的数据损失。
⑵半手工方式。这种方式就是计算机管理员事先建立备份或者恢复数据库的作业,待到备份或者恢复数据库的时候,管理员打开“SQLSERVERENTEPRISEMANAGER”,在“MANAGER”里找到相应的作业,然后执行之。这种方式,虽然是基于作业方式实现的,但是计算机管理员必须打开数据库管理器,而且要在繁多的作业中进行选择。一旦选择错误并执行后,也有可能带来意想不到的损失。
⑶全自动方式。在数据库管理器里面,计算机管理员事先建立好恢复或者备份数据库的作业,然后定制一个执行计划,让计算机在特定的条件下完全靠自己执行备份和恢复操作。这种方式看起来简单、省事,但是计算机在意外情况之下,就不能按照你设定的计划执行了。
3.作业机制的工作原理
作业是ENTERPRISEMANAGER提供的一种定期处理数据的一种方法,前面提到的半手工方式和全自动方式虽然利用了作业,但它需要在ENTERPRISEMANAGER里启动和关闭作业;我要研究讨论的是在应用程序客户端启动和关闭作业的机制。我这里讲的作业机制的工作原理,是由控制体和执行体两大部分构成。控制体顾名思义就是控制作业执行的实体,靠具体编程实现。实现时,要调用MSDB数据库系统存储过程SP_START_JOB,SP_END_JOB等等,同时要访问表SYSJOBHITORY,获取作业执行状态。
执行体就是作业执行的整体,应用系统投入使用时建立。应用系统安装时,要建立数据库、备份和恢复设备、备份和恢复作业。
控制体由用户触发,启动相应的作业,交由执行体执行作业,在执行过程中,执行体执行的每一步状态信息都要写入MSDB数据库的SYSJOBHISTORY表里。同时,控制体不断获取执行状态信息,根据这些信息,控制体决定继续执行还是停止该作业。在作业执行完毕或者出错停止后,控制体向用户反馈执行结果。
4.以作业机制实现数据库的备份和恢复
我为了便于解释以POWERBUILDER实现的一个具体系统为示例,首先看一下数据库备份的实现步骤。
4.1执行体的建立
(1)建立应用系统的数据库XCCXXT。
(2)建立备份数据库所使用的设备XCCXXTBAK.DAT。
(3)建立备份作业XCCXXTBACKUP,其中命令行为BACKUPDATABASEXCCXXTTODISK=“C:\MSSQL7\DATA\BACKUP\XCCXXTBAK.DAT”。
4.2控制体的实现
在相应对象的“备份”按钮的click事件中写入以下代码:
//声明相应的变量
stringls_database,ls_pass,ls_date,ls_time
integerli_gs,li_gs_o
transactionlogin_trans
login_trans=creattransaction
IFMessageBox("提示信息","是否真的要进行数据备份操作?",&
Exclamation!,OKCancel!,2)<>1thenreturn
//连接MSDB数据库
login_trans.database="msdb"
connectusinglogin_trans;
iflogin_trans.sqlcode<>0then
messagebox("数据库错误信息",login_trans.sqlerrtext)
return
endif
//检测上次该执行体执行结果,用以区别本次执行状况
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
//运行系统存储过程SP_START_JOB,启动执行体
preparesqlsafrom"sp_start_job?"usinglogin_trans;
iflogin_trans.sqlcode<>0then
messagebox("数据库错误信息",login_trans.sqlerrtext)
login_trans.autocommit=false
disconnectusinglogin_trans;
login_trans.database=ls_database
return
endif
EXECUTEsqlsaUSING‘XCCXXTBACKUP’;
//检测执行体启动是否正常
iflogin_trans.sqlcode<>0then
messagebox("数据库错误信息",login_trans.sqlerrtext)
login_trans.autocommit=false
disconnectusinglogin_trans;
return
endif
//检测执行体执行的整个过程
DO
uf_sleep(1)
selectmax(instance_id)into:li_gsfromsysjobhistoryusinglogin_trans;
ifisnull(li_gs)thenli_gs=0
LOOPWHILEli_gs<=li_gs_o+1
//运行系统存储过程SP_END_JOB,关闭执行体
preparesqlsafrom"sp_end_job?"usinglogin_trans;
iflogin_trans.sqlcode<>0then
messagebox("数据库错误信息",login_trans.sqlerrtext)
login_trans.autocommit=false
disconnectusinglogin_trans;
login_trans.database=ls_database
return
endif
EXECUTEsqlsaUSING‘XCCXXTBACKUP’;
//返回执行结果
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(’提示’,"数据库备份操作成功!")
else
messagebox(’提示’,"数据库备份操作失败!")
endif
//断开与数据库MSDB的连接
login_trans.autocommit=false
disconnectusinglogin_trans;
iflogin_trans.sqlcode<>0then
messagebox("数据库错误信息",login_trans.sqlerrtext)
endif
4.3备份数据库
用户单击“备份”按钮,系统就会备份XCCXXT数据库。结束时,会有相应成功与否的信息向用户提示。
备份是对数据库的进行读操作,执行体执行之