现在的位置: 首页 > 综合 > 正文

使用sql语句备份和恢复SQLserver数据库,以及需要注意的事项

2013年05月28日 ⁄ 综合 ⁄ 共 1118字 ⁄ 字号 评论关闭

  本文转自: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  

  然后调用恢复语句既可以实现,但是必须保证,杀死其他用户连接时,必须在恢复的时间段里面不能再有其他用户连接到数据库

 

抱歉!评论已关闭.