本文转自:http://hi.baidu.com/yanzuoguang/blog/item/e94b2534d44b6b83a71e1255.html
在此严重感谢该文作者!因为看了那么多作者写的数据库恢复语句,没有一个提到:恢复必须在单用户模式下操作才能够成功,
更没有一个提到:存储过程不要建立在目标数据库中。对于新手,如果不知道这样两个前提就来搞恢复,会碰到各种各样的问题。
备份:backup database dbname to disk=';d:\dbn.aa';
恢复:restore database dbname from disk=';d:\dbn.aa';
恢复必须在单用户模式下操作才能够成功,我们需要断开其他用户的连接,并且切换到其他数据库,才能够成功
我们可以通过写存储过程来断开其他用户的连接
我以前曾经这样实验过
1 找到所有与这个数据库的连接,全部KILL (用VB调用一个存储过程来实现)
2 在用VB调用另外一个写好的存储过程来进行恢复,注意两个存储过程都不要建立在目标数据库中。
在我自己的项目中,我是将下面的killrubbishprocess存储过程建立在了sql server系统保留数据库master
中,同时将上面的恢复语句也写成存储过程建立在master中。
这里我把杀掉连接的存储过程提供给你,恢复数据库的存储过程很简单你自己来吧。
CREATE PROCEDURE dbo.killrubbishprocess AS
DECLARE @spidnum int
DECLARE rubbish_CURSOR CURSOR FOR
select spid
from master.dbo.sysprocesses
where spid > 10 and spid <= 32767 and status='sleeping' and loginame='sa'
order by spid
OPEN rubbish_CURSOR
FETCH NEXT FROM rubbish_CURSOR
INTO @spidnum
select s_kill = "kill " + cast(@spidnum as char(5))
WHILE @@FETCH_STATUS=0
BEGIN
EXEC (s_kill)
FETCH NEXT FROM rubbish_CURSOR
INTO @spidnum
END
CLOSE rubbish_CURSOR
DEALLOCATE rubbish_CURSOR
GO
然后调用恢复语句既可以实现,但是必须保证,杀死其他用户连接时,必须在恢复的时间段里面不能再有其他用户连接到数据库