none
这段sql备份再恢复的的代码错在哪里了啊? RRS feed

  • 问题

  • 这段sql备份再恢复的的代码错在哪里了啊?

        ----------------------------代码1--------------------------------

     
    --USE master
    --backup database 长铁物业公司资产数据库
    --To disk='d:\backup\长铁物业公司资产数据库备份_Full-2013-08-27.bak'
    
    ----Kill掉访问某个数据库的连接
    CREATE PROC KillSpid(@DBName varchar)
    AS
    BEGIN
    DECLARE @SQL varchar
    DECLARE @SPID int
    SET @SQL='DECLARE CurrentID CURSOR FOR 
    SELECT spid FROM sysprocesses WHERE dbid=db_id('''+@DBName+''') '
    FETCH NEXT FROM CurrentID INTO @SPID
    WHILE @@FETCH_STATUS <>-1
    BEGIN
         exec('KILL '+@SPID)
         FETCH NEXT FROM  CurrentID INTO @SPID
         END
         CLOSE CurrentID
         DEALLOCATE CurrentID
    END
    
    go
    USE master
    declare @DBName varchar(100)
    set @DBName='长铁物业公司资产数据库'
    exec SP_DBOPTION @DBName,'single user','true'
    go
    RESTORE DATABASE 长铁物业公司资产数据库
    FROM DISK='d:\backup\长铁物业公司资产数据库备份_Full-2013-08-27.bak'
    WITH REPLACE
    
    

    ------------------------------图1------------------------------------


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2013年8月27日 9:09

答案

  • 我总结一下吧

    USE master
    GO
    --先将数据库设置为SINGLE_USER
    ALTER DATABASE 长铁物业公司资产数据库 SET SINGLE_USER WITH ROLLBACK IMMEDIATE
    GO
    --再执行一下kill存储过程确保没有连接到数据库的session
    EXEC KillSpid '长铁物业公司资产数据库'
    GO
    --还原数据库
    RESTORE DATABASE 长铁物业公司资产数据库
    FROM DISK='d:\backup\长铁物业公司资产数据库备份_Full-2013-08-27.bak'
    WITH REPLACE

    至于还原数据库要在停机时间里面做就不多说了,其他注意事项也不多说了,大家都懂的

    2013年8月28日 3:26

全部回复

  • kill不靠谱的。哪个菜鸟给你的代码?

    还原前把数据库设置为脱机。

    ALTER DATABASE database_name SET OFFLINE WITH ROLLBACK IMMEDIATE


    想不想时已是想,不如不想都不想。

    2013年8月27日 9:22
    版主
  • 不是您的SQL语句错误,是您当前要还原的数据库有人在使用,所以您是还原不了

    你需要kill掉所有连接到还原数据库的连接,您才能还原

    USE master
    DECLARE @DBName VARCHAR(100)
    SET @DBName = '长铁物业公司资产数据库'
    EXEC KillSpid '长铁物业公司资产数据库'
    RESTORE DATABASE 长铁物业公司资产数据库
    FROM DISK='d:\backup\长铁物业公司资产数据库备份_Full-2013-08-27.bak'
    WITH REPLACE


    exec SP_DBOPTION @DBName,'single user','true'
    go

    去掉

    使用上面的SQL语句就可以了

    2013年8月27日 9:23
  • 对于繁忙的数据库,kill不靠谱。single user和offline才是安全的做法。

    想不想时已是想,不如不想都不想。

    2013年8月27日 11:05
    版主
  • 这个当然,不过用single user有可能还存在用户连接数据库的情况,最后还原不了数据库
    2013年8月27日 11:11
  • 其实Kill掉之后还会有其他的Session进来会很麻烦,改为Single User还原会比较好。


    Please Mark As Answer if it is helpful.


    • 已编辑 KevinLiu328 2013年8月28日 2:24 有问题
    2013年8月28日 2:22
  • Setting to single user makes more trouble in my experience, have hard time to find out which spid is on many times especially that session is from app service. 
    2013年8月28日 2:29
  • 听了各位的意见我有些糊涂了,那种还原比较科学啊?目前我用的是下面的代码,暂时没发生错误!
    USE master
    ALTER DATABASE 长铁物业公司资产数据库 SET OFFLINE WITH ROLLBACK IMMEDIATE
    RESTORE DATABASE 长铁物业公司资产数据库
    FROM DISK='d:\backup\长铁物业公司资产数据库备份_Full-2013-08-27.bak'
    WITH REPLACE


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2013年8月28日 2:34
  • 如果在停机时间里面做,我觉得可以用SET OFFLINE,没有错误就可以了
    2013年8月28日 2:39
  • User can't use db during restore anyway, set offline is move safer. If no any user has dbo rights in the db, can set to restricted_user.
    2013年8月28日 2:47
  • 我觉得对于LZ的问题大家讨论得有点离题了,好像越说越远,虽然在实际生产环境有很多注意的问题

    不过LZ的问题是:这段sql备份再恢复的的代码错在哪里了啊???

    2013年8月28日 2:54
  • 不会的。你连上去后,设为single user,别的进程就连不上了。

    想不想时已是想,不如不想都不想。

    2013年8月28日 3:00
    版主
  • Setting to single user makes more trouble in my experience, have hard time to find out which spid is on many times especially that session is from app service. 

    什么意思?你连上去后,设置为single user,就会把其它用户都踢下去的。

    你知道alter database有with rollback选项吧?


    想不想时已是想,不如不想都不想。

    2013年8月28日 3:02
    版主
  • 你可以给楼主解释一下。

    不过楼主的目的我想是解决问题。


    想不想时已是想,不如不想都不想。

    2013年8月28日 3:04
    版主
  • Setting to single user makes more trouble in my experience, have hard time to find out which spid is on many times especially that session is from app service. 

    什么意思?你连上去后,设置为single user,就会把其它用户都踢下去的。

    你知道alter database有with rollback选项吧?


    想不想时已是想,不如不想都不想。

    You can't connect to that db to restore it, so opens door for someone else.
    2013年8月28日 3:07
  • 我总结一下吧

    USE master
    GO
    --先将数据库设置为SINGLE_USER
    ALTER DATABASE 长铁物业公司资产数据库 SET SINGLE_USER WITH ROLLBACK IMMEDIATE
    GO
    --再执行一下kill存储过程确保没有连接到数据库的session
    EXEC KillSpid '长铁物业公司资产数据库'
    GO
    --还原数据库
    RESTORE DATABASE 长铁物业公司资产数据库
    FROM DISK='d:\backup\长铁物业公司资产数据库备份_Full-2013-08-27.bak'
    WITH REPLACE

    至于还原数据库要在停机时间里面做就不多说了,其他注意事项也不多说了,大家都懂的

    2013年8月28日 3:26
  • 你都设置成SINGLE USER了还执行Kill命令干嘛?

    Please Mark As Answer if it is helpful.

    2013年8月28日 4:39
  • offline比single_user可靠。

    另外如Kevin所说,不用kill


    想不想时已是想,不如不想都不想。

    2013年8月28日 7:30
    版主