sql2008超大数据库的恢复100G以上 方法

33次阅读
没有评论

简单的还原:

第一种(未测试)
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

第四种:
–返回由备份集内包含的数据库和日志文件列表组成的结果集。
–主要获得逻辑文件名
restore filelistonly from disk = ‘E:/levws.bak’

/*
利用bak恢复数据库,强制还原(REPLACE)
STATS = 10 每完成10%显示一条记录
DBTest和DBTest_log是上面g:\back.Bak里的逻辑文件
*/

USE master 
RESTORE DATABASE levws --levws 是数据库名 
FROM DISK = 'E:\levws.bak' --数据库备份路径及文件名
WITH MOVE 'levws_Data' TO 'E:\levws_Data.MDF', --还原后的数据库文件
MOVE 'levws_Log' TO 'E:\levws_Log.LDF', --还原后的数据库日志文件
STATS = 10, REPLACE --执行命令时每完成10%显示一条消息,我设置成5%
GO

结果:
已为数据库 ‘levws’,文件 ‘levws_Data’ (位于文件 1 上)处理了 374352 页。
已为数据库 ‘levws’,文件 ‘levws_Log’ (位于文件 1 上)处理了 1 页。
正在将数据库 ‘levws’ 从版本 539 转换为当前版本 655。

RESTORE DATABASE 成功处理了 374353 页,花费 205.725 秒(14.216 MB/秒)。

本人测试,备份文件104G,还原后文件总大小260G,使用时间60分钟左右,,不过最后提示正在异常结束,随后数据库显示正在还原。
具体恢复是否成功待测试。

第五种
使用sql2008–任务–还原文件和文件组(此方法正在测试中)
提示内存不足,后结束,数据库显示正在还原
第六种
直接复制运行中的数据库,用rar压缩备份,还原时直接解压后附加就可以了。。。理论可行
相关链接
RESTORE 还原数据库-详细说明
在SQL Server中强制还原已存在的数据库(文中第一至第三种方法)

正文完