感谢boyd大人提供的方法。看后我幡然醒悟:要在与数据库交互才能进入的管理系统中恢复数据结构,就犹如站在树枝上锯树干。
于是我在这里用了双数据库。将基本表(用户信息、菜单信息)置于数据库A中,以构成管理系统的框架;其余大量数据置于数据库B中,这样便可在A框架下备份恢复数据库B。
在boyd的方法以及大众方法中,存在这样的问题:每备份数据库一次,备份文件便会成倍增大,新旧数据共处于一个文件中,要恢复某次的备份数据很困难。
因而我在备份时用某次的时间命名文件,并把路径和文件名记录到数据库A。再把用户最后一次录入文本框的内容滞留下来。在默认情况下恢复的是最近一次备份数据,用户也可选择之前某次的备份文件来进行恢复。
核心源代码如下:
<!--#include file="../login/check.asp" -->
<!--#include file="../../inc/conn1.asp" -->
<!--#include file="../../inc/function.asp" -->
<HTML>
<BODY>
<FORM method="post" name="form1">
<table width="100%" height="136">
<tr><td width="25%" height="32">选择操作:</td>
<td width="75%">
<INPUT TYPE="radio" NAME="act" id="act_backup" value="backup">备份
<INPUT TYPE="radio" NAME="act" id="act_restore" value="restore">恢复
</td></tr>
<tr><td height="32">数据库名:</td>
<td><INPUT TYPE="text" NAME="databasename" value="FTS">输入要操作的数据库名</td>
</tr>
<tr><td height="30">文件路径:</td>
<td height="30">
<% '这里是选取出最后一次输入的路径与文件名,表DBinfo的id设为自动增长型
dim Rs,Sql,Sql1,pathinfo,num
sql="Select Max(id) From DBinfo"
Set rs= Server.CreateObject("ADODB.Recordset")
rs.open sql,conn,1,1
num=Rs(0)
sql1="select * from DBinfo where id="&num
Set rs= Server.CreateObject("ADODB.Recordset")
rs.open sql1,conn,1,1
pathinfo=Rs("PathInfo")
%>
<INPUT TYPE="text" NAME="bak_file" value="<%=pathinfo%>">输入存储的路径及名称</td>
</tr>
<tr><td height="30"></td>
<td height="30">
'这里要确认一下操作
<input type="submit" onClick="{if(confirm('确定所选定的操作吗!?')){this.document.submit();return true;}return false;}" value="确 定">
</td> </tr>
</table>
<%
dim sqlserver,sqlname,sqlpassword,sqlLoginTimeout,databasename,bak_file,act
sqlserver = "TENGHE-YEXX"
sqlname = "sa"
sqlpassword = ""
sqlLoginTimeout = 15
databasename = trim(request("databasename"))
bak_file = trim(request("bak_file"))
act = lcase(request("act"))
if databasename = "" then
response.write "<font color=red>请输入要备份或恢复的数据库名,并暂停其它数据库操作!</font>"
else
if act = "backup" then
Set srv=Server.CreateObject("SQLDMO.SQLServer")
srv.LoginTimeout = sqlLoginTimeout
srv.Connect sqlserver,sqlname, sqlpassword
Set bak = Server.CreateObject("SQLDMO.Backup")
bak.Database=databasename
bak.Devices=Files
bak.Files=bak_file
bak.SQLBackup srv
'弹出提示窗口表示操作成功或失败
on error resume next
If err Then
Call showerror("出错了,数据库备份失败!")
Else
Call showsuccess("备份成功","backup.asp")
End If
'备份成功后记录备份路径与文件名
set rs=server.createobject("adodb.recordset")
rs.open "DBinfo",conn,1,2
rs.addnew
rs("PathInfo") = bak_file
rs.update
elseif act = "restore" then
'恢复时要在没有使用数据库时进行!
Set srv=Server.CreateObject("SQLDMO.SQLServer")
srv.LoginTimeout = sqlLoginTimeout
srv.Connect sqlserver,sqlname, sqlpassword
Set rest=Server.CreateObject("SQLDMO.Restore")
rest.Action=0 ' full db restore
rest.Database=databasename
rest.Devices=Files
rest.Files=bak_file
rest.ReplaceDatabase=True 'Force restore over existing database
rest.SQLRestore srv
on error resume next
If err Then
Call showerror("出错了,数据库恢复失败!")
Else
Call showsuccess("恢复成功","backup.asp")
End If
end if
end if
%>
</div>
</FORM>
</BODY>
</HTML>