ASP远程备份和恢复SQL数据库的方法

时间:2022-08-05 01:37:57

ASP远程备份和恢复SQL数据库的方法

摘要:该文通过ASP程序实例,介绍了远程备份和恢复SQL数据库的方法。

关键词:ASP;SQL;远程;备份;恢复

中图分类号:TP311文献标识码:A文章编号:1009-3044(2009)32-8868-02

ASP Remote SQL Database Backup and Restore the Method

WENG Wen-hui

(Huangyan District, Toyama Power Authority, Taizhou 318023, China)

Abstract: Based on ASP program, for example,introduces remote SQL database backup and restore the method.

Key words: ASP; SQL; remote; backup and restore

近年来,SQL数据库遭到注入攻击是很常见,通常在程序中加上防注入代码就可以抵御这类攻击。但有的时候,因为程序文件比较多或者其他某原因,暂时无法防住注入攻击,这时网站维护人员就比较头疼了。本人便遇到过这样的事,这个网站数据量不大,更新也不算频繁,所以被注入后就需要恢复之前备份的数据库。最初是通过远程桌面连到服务器上,手动恢复SQL数据库,也不算费劲。但后来有段时间,注入攻击非常频繁,一天可能发生好几次,这样就比较麻烦了。总是维护人员发现注入,打电话通知我,我再恢复数据库,这样经常会使用问题的处理时间比较长。而且有时网站刚更新了一部分数据,不久遭到注入攻击,这时直接恢复数据库就会丢失刚更新的数据,没办法,只有手工清除注入的代码或者恢复后重新更新。这样的事情发生几次之后,我就产生了做一个程序让网站维护人员自己在更新数据之后备份数据库,在发现注入攻击后自己完成数据库的恢复。

1 技术准备

1.1 备份

备份的问题比较好处理,与数据库建立连接后,执行BACKUP语句就可以实现。

BACKUP语句语法为:

BACKUP DATABASE { database_name | @database_name_var }

[ ,...n ]

TO [ ,...n ]

[ ] [ next-mirror-to ]

[ WITH { DIFFERENTIAL | [ ,...n ] } ]

[;]

第一行:BACKUP DATABASE 数据库名;

第二行:文件名,一般只在数据库的大小和性能要求使得进行数据库备份无法实现时用到;

第三行:指定用于备份操作的逻辑备份设备或物理备份设备,这个是我们要用到的;

第四行:指定一组辅助备份设备(最多三个),其中每个设备都将镜像 TO 子句中指定的备份设备,因为没这种需求,可以忽略;

第五行:这行比较重要,指定了备份的各种参数,这里只介绍几种可能用到的,其他的请查阅MSDN。

DIFFERENTIAL:指定数据库备份或文件备份应该只包含上次完整备份后更改的数据库或文件部分,即差异备份。

NOINIT | INIT:控制备份操作是追加到还是覆盖备份媒体中的现有备份集。默认为追加到媒体中最新的备份集 (NOINIT)。

权限要求:默认授予 sysadmin 固定服务器角色和 db_owner 及 db_backupoperator 固定数据库角色的成员。

1.2 恢复

恢复的问题就比较麻烦,首先要以SA用户登陆,其次是要中止其他用户与数据库的连接,然后才能用RESTORE语句恢复数据库。

中止其他用户与数据库的连接,如不进行这个操作,在恢复过程中多半会出现“因为数据库正在使用,所以未能获得对数据库的排它访问权。”的提示:

exec p_killspid 数据库名

这里使用了一个自定义的存储过程,代码如下:

CREATEproc p_killspid

@dbname varchar(200)--要关闭进程的数据库名

as

declare @sqlnvarchar(500)

declare @spid nvarchar(20)

declare #tb cursor for

select spid=cast(spid as varchar(20)) from master..sysprocesses where dbid=db_id(@dbname)

open #tb

fetch next from #tb into @spid

while @@fetch_status=0

begin

exec('kill '+@spid)

fetch next from #tb into @spid

end

close #tb

deallocate #tb

GO

RESTORE语句语法为:

RESTORE DATABASE { database_name | @database_name_var }

[ ,...n ]

[ FROM [ ,...n ] ]

WITH

{

[ RECOVERY | NORECOVERY ]

[ , [ ,...n ] ]

} [ ,...n ]

[;]

第一行:RESTORE DATABASE 数据库名;

第二行:文件名,一般只在数据库的大小和性能要求使得进行数据库备份无法实现时用到;

第三行:指定用于备份操作的逻辑备份设备或物理备份设备,这个是我们要用到的;

第六行:NORECOVERY 指定不发生回滚。从而使前滚按顺序在下一条语句中继续进行。

在这种情况下,还原顺序可还原其他备份,并执行前滚。

RECOVERY(默认值)表示,应在完成当前备份前滚之后执行回滚。

其他参数略。

权限要求:如果不存在要还原的数据库,则用户必须有 CREATE DATABASE 权限才能执行 RESTORE。如果该数据库存在,则 RESTORE 权限默认授予 sysadmin 和 dbcreator 固定服务器角色成员以及该数据库的所有者 (dbo)(对于 FROM DATABASE_SNAPSHOT 选项,该数据库始终存在)。

RESTORE 权限被授予那些成员身份信息始终可由服务器使用的角色。因为只有在固定数据库可以访问且没有损坏时(在执行 RESTORE 时并不会总是这样)才能检查固定数据库角色成员身份,所以 db_owner 固定数据库角色成员没有 RESTORE 权限。

下面顺便说一下有可能出现的一些问题:

1)恢复数据库后,增加登录名出现“数据库中的用户名存在“,但是登录名却显示而且新加用户会提示用户已存在 !”,这时需要执行以下代码:

sp_change_users_login 'update_one','数据库用户名称','登录名称'

2)无法更改数据库中对象的所有者,这时需要使用如下代码:

exec sp_changeobjectowner '原所有者名',[dbo]

执行存储过程changename

exec changename '原所有者名','新所有者名'

2 程序代码

if act="B" then’备份数据库

SQL="backup database WebSiteData to disk='"&Server.MapPath("bk")&"\"&"bk.bak"&"' with INIT"

set cnn=Server.createobject("adodb.connection")

cnn.open "driver={SQL Server};server=(local);uid=abc;pwd=123;database= WebSiteData " ‘建立与数据库的连接

cnn.execute SQL

on error resume next

if err0 then

response.write "错误:"&err.Descripting

else

response.write "数据备份成功!"

end if

cnn.close

set cnn=nothing

end if

if act="R" then’恢复数据库

SQL="Restore database WebSiteData from disk='"&Server.MapPath("bk")&"\"&"bk.bak"&"'"

set cnn=Server.createobject("adodb.connection")

cnn.open "driver={SQL Server};server=(local);uid=sa;pwd=123;database=master" ‘以SA用户身份登录

cnn.execute("exec p_killspid'WebSiteData'")’结束其他用户与数据库连接

cnn.execute SQL ‘恢复数据库

on error resume next

if err0 then

response.write "错误:"&err.Descripting

else

response.write "数据恢复成功!"

end if

cnn.close

set cnn=nothing

end if

%>

3 结束语

接收程序改为多线程异步接收方式后,经测试无丢包现象。通过此次实践笔者认为多线程异步SOCKET接收并不像想象中那么复杂,只要弄清楚各线程的启动顺序、互相之间的关系就可以很容易地实现各种应用。当然,其中还是有些细节问题需要读者在实际应用中注意的,如:数据接收线程中无法直接在启动界面中显示数据(因为同一线程)、如何把DataGridView中数据直接写入数据库等,篇幅有限无法在此讨论。

本程序在WINDOWS XP、VS 2005中调试通过。

参考文献:

[1] Silberschatz A.数据库系统概念[M].杨冬青,马秀莉,译.5版.北京:机械工业出版社,2008.

[2] 唐学忠.SQL Server 2000数据库教程[M].北京:电子工业出版社,2005.

[3] 张跃廷数据库系统开发完全手册[M].北京:人民邮电出版社,2007.

上一篇:无线城域网通信技术IEEE802.16协议架构及技术... 下一篇:中缀及后缀算术表达式在运算中的应用研究