在SQL Server中强制还原已存在的数据库

简单的还原:

restore   database   eat   from   备份设备名   
restore   database   eat   from   disk='d:/备份dmp文件名'  
以上两种方法用一种就可以了,注意默认的数据库不能是要还原的数据库

以下是一段在SQL Server中强制还原已存在的数据库的代码:

/*  
        --强制还原已存在的数据库,基本原理是Kill掉数据库的所有会话  
        --原贴在http://www.sqlservercentral.com/scripts/contributions/827.asp  
        --在此基础上添加了with   move选项,如果不提供新文件物理位置,则默认为SQL   Server    
        --安装目录  
        --调用;  
        --use   master  
        --go  
        --exec   master..spForceRestoreDB   'test2'  
                                                                    ,'c:/test.bak'  
                                                                    ,'c:/db/test_data.mdf'  
                                                                    ,'c:/db/test_log.mdf'  
        --vivianfdlpw   2005.9   引用请保留此信息  
  */  
  CREATE   PROCEDURE   spForceRestoreDB  
          @DatabaseName   varchar(50),                         --要恢复的数据库名  
          @BackupFile   varchar(255),                           --备份文件路径  
          @NewDataFilePath     varchar(255)=null,     --新物理文件位置  
          @NewLogFilePath     varchar(255)=null         --新日志文件位置  
  WITH   ENCRYPTION  
  AS  
  BEGIN  
  SET   NOCOUNT   ON    
    DECLARE   @exists   int  
    IF   NOT   EXISTS(   select   name   from   master.dbo.sysdatabases   WHERE   name   =   @DatabaseName)  
    BEGIN  
    PRINT   '     Database   '   +   @DatabaseName   +   '   not   found   '  
    PRINT   '     Enter   valid   Datbase   name'  
    RETURN  
    END  
    EXEC   master.dbo.xp_fileexist   @BackupFile   ,   @exists   OUTPUT  
    if   (@exists   =   0)  
    BEGIN  
    PRINT   '     File   '   +   @BackupFile   +   '   Does   bot   Exist'  
    PRINT   '     Database   cannot   be   restored'  
    PRINT   '     Enter   the   valid   Backup   File'  
    RETURN  
    END  
            --   Cursor   for   all   the   spids   running   against   this   database  
    DECLARE   SysProc   CURSOR   LOCAL   FORWARD_ONLY   DYNAMIC   READ_ONLY   FOR  
    SELECT   spid  
    FROM   master.dbo.sysprocesses  
    WHERE   dbid   =   (   SELECT   dbid   FROM   master.dbo.sysdatabases  
            WHERE   name   =   @DatabaseName)  
    DECLARE   @SysProcId   smallint  
    --   Opens   the   Cursor  
    OPEN   SysProc  
    --   Fetch   the   Process   ID   into   the   cursor  
      FETCH   NEXT   FROM   SysProc   INTO   @SysProcId  
    DECLARE   @KillStatement   char(30)  
    WHILE   @@FETCH_STATUS   =   0  
    BEGIN  
      SET   @KillStatement   =   'KILL   '   +   CAST(@SysProcId   AS   char(30))  
      --   Kills   the   processes   running   against   the   database  
      EXEC   (@KillStatement)  
      FETCH   NEXT   FROM   SysProc   INTO   @SysProcId  
    END  
    WAITFOR   DELAY   '000:00:01'  
                  create   table   #    
                (LogicalName   varchar(255),    
                  PhysicalName   varchar(255),    
                  Type   varchar(20),    
                  FileGroupName   varchar(255),    
                  Size   varchar(20),    
                  MaxSize   varchar(20)   )  
                  declare   @cmd   varchar(200)  
                                  ,@DataLogicName   varchar(20)  
                                  ,@logLogicName   varchar(20)  
                  select   @cmd   =   'RESTORE   FILELISTONLY   FROM   disk   =   '''+   @BackupFile   +   ''''    
                  insert   #   exec(@cmd)  
                  select   @DataLogicName=LogicalName   from   #   where   Type='D'  
                  select   @logLogicName=LogicalName   from   #   where   Type='L'  
                  drop   table   #  
                  if   @NewDataFilePath   is   null  
                  begin  
                        select   @NewDataFilePath=replace(filename,'master.mdf','')   from   master..sysdatabases    
                        where   dbid=db_id('master')  
                        select   @NewDataFilePath=@NewDataFilePath+@DatabaseName+'_Data.mdf'  
                  end  
                  if   @NewLogFilePath   is   null  
                  begin  
                        select   @NewLogFilePath=replace(filename,'master.mdf','')   from   master..sysdatabases    
                        where   dbid=db_id('master')  
                        select   @NewLogFilePath=@NewLogFilePath+@DatabaseName+'_Log.ldf'  
                  end  
    DECLARE   @strSql   varchar(2000)  
    SET   @strSql   =   'RESTORE   DATABASE   '  
    SET   @strSql   =   @strSql   +   QUOTENAME(@DatabaseName)      
    SET   @strSql   =   @strSql   +   'FROM     DISK   =   N'+   ''''   +   @BackupFile   +   ''''    
    SET   @strSql   =   @strSql   +   '   WITH     FILE   =   1,     NOUNLOAD   ,     STATS   =   10,     RECOVERY   ,     REPLACE'  
                  SET   @strSql   =   @strSql   +   ',Move   '''+@DataLogicName+'''   to   '''+@NewDataFilePath+''''  
                  SET   @strSql   =   @strSql   +   ',Move   '''+@logLogicName+'''   to   '''+@NewLogFilePath+''''  
    --PRINT   @strSql  
    --   Restore   the   Database  
    EXEC   (@strSql)  
  SET   NOCOUNT   OFF    
  END  
  GO  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值