SQL2000 数据库备份是一项很常见的操作,但是需要注意的问题却不少,很多细节如果处理不当,往往会发生些莫名其妙的问题,让人十分不知所措,本文以一个最简单的例子来阐述一个具体的备份/还原的整个过程,其他功能性应用请参考资料。
一. 数据库备份:
数据库备份操作可以在master数据库上,也可以在需要备份的数据库上,没有特别的要求,SQL指令也并不复杂:
1. 首先打开连接(本例打开master,这些其实和数据备份无关,都是常规操作)
"
Server="localhost"
User="sa"
Pwd="123456"
ConnStr = "driver={sql server}server=" Server "UID=" User "pwd=" Sa "Database=master"
Dim Conn As New ADODB.Connection
Conn.ConnectionString = ConnBackup
Conn.Open
2. 备份数据库
数据库备份分两种方式:完整备份和差异备份,前者备份得彻底,但速度较慢,后者只备份有差异的部分,速度快些。
A. 完整备份(假设需要备份的数据库名为XXXX):
Conn.Execute = "backup database XXXX to disk=D:BackupmyBase.dat with name=XXXX backup all,description=Full Backup Of XXXX"
B. 差异备份
Conn.Execute = "backup database XXXX to disk=D:BackupmyBase.dat with differential,noinit,name=XXXX backup dif,description=Differential Backup Of XXXX"
二. 数据库还原:
数据库还原是比较麻烦的一件事,因为在一个数据库尚在使用的时候,是不允许对它进行还原的,
我们首先需要将指定数据库关闭,但是但经我的实验证明,并非简单地将指定数据库Close就算是“关闭”了,
比如存在一个活动的数据库连接Conn1,使用Conn1.Close之后,再打开SQL企业管理器-管理-当前活动-刷新,你还是可以看到
你刚才打开的数据库进程。只有将整个应用程序程序都关闭之后,那条进程才会消失。如果不杀掉进程就执行还原操作,SQL系统将报错:
“因为数据库正在使用,所以未能获得对的排它控制权”。
所以只能通过别的办法去关闭数据库进程并还原(真麻烦!):
A. 查出所有数据库进程ID
B. 创建一个临时表以存储数据库名,查出SQL系统中所有活跃的进程,DB_NAME函数将dbid转换成数据库名称:
C. 查出指定的数据库名
D. 使用Kill指令杀掉这些进程的spid
E. 使用Restore将备份文件还原到SQL数据库
VBCODE如下:
Dim R As Integer
Dim ConnRes As New ADODB.Connection, rstDbname As New ADODB.Recordset
ConnRes.ConnectionString = ConnStr
ConnRes.Open
On Error Resume Next
ConnRes.Execute "DROP TABLE #temp_dbname" 删除临时数据表 (如果存在,则删除)
On Error GoTo 0
获取SQL进程ID,并放到临时表
ConnRes.Execute "select spid,dbid,DB_NAME(dbid) as dbname into #temp_dbname from master..sysprocesses"
返回记录集到rstDbname
SQLQuery = "select spid from #temp_dbname where dbname=XXXX"
rstDbname.CursorLocation = adUseClient
rstDbname.Open SQLQuery, ConnRes, adOpenKeyset, adLockPessimistic
删除rstDbname中全部有关数据库“XXXX”的进程
If rstDbname.RecordCount 0 Then
rstDbname.MoveFirst
Do
ConnRes.Execute "kill " rstDbname("spid")
rstDbname.MoveNext
Loop Until rstDbname.EOF
End If
执行还原操作
ConnRes.Execute "restore database XXXX from disk=d:BackupmyBase.dat with replace"