一、对正在使用的数据库,执行还原处理

   把当前正在使用的数据库文件和日志文件移动到 另个路径下, 然后再用完整备份文件进行还原 

 

restore DATABASE Test  from disk=N'F:\DBBackUp\Test\20160511155000_full.bak'  WITH NORECOVERY, REPLACE,
 move 'Test'  to 'F:\DBBackUp\新建文件夹\Test.mdf',
 move 'Test_log' to 'F:\DBBackUp\新建文件夹\Test_log.ldf'

 GO
 RESTORE DATABASE Test FROM DISK= N'F:\DBBackUp\Test\20160511155000_full.bak' 
 GO

RECOVERY 和 NORECOVERY 的比较

完整还原阶段,使用了WITH NORECOVERY,而差异还原,则是使用了RECOVERY。

  • NORECOVERY 指定不发生回滚。 从而使前滚按顺序在下一条语句中继续进行。在这种情况下,还原顺序可还原其他备份,并执行前滚。
  • RECOVERY(默认值)表示,应在完成当前备份前滚之后执行回滚。恢复数据库要求要还原的整个数据集(“前滚集”)必须与数据库一致。 如果前滚集尚未前滚到与数据库保持一致的地步,并且指定了 RECOVERY,则数据库引擎将发出错误。
  • 因此RESTORE...WITH RECOVERY状态就表明此时数据库已经处于一致性状态了。一般都是数据库还原的最后一步才会使用RESTORE...WITH RECOVERY,其他时候都是使用RESTORE...WITH NORECOVERY。



2、完整备份、差异备份一起还原

restore DATABASE Test  from disk=N'F:\DBBackUp\Test\20160511155000_full.bak'  WITH NORECOVERY, REPLACE,
 move 'Test'  to 'F:\DBBackUp\新建文件夹\Test.mdf',
 move 'Test_log' to 'F:\DBBackUp\新建文件夹\Test_log.ldf'

 GO
 RESTORE DATABASE Test FROM DISK= N'F:\DBBackUp\Test\20160511155000_full.bak' WITH NORECOVERY
 GO
 RESTORE DATABASE Test FROM DISK= N'F:\DBBackUp\Test\20160511155600_diff.bak' WITH RECOVERY (最后一次差异备份)




场景:完整备份15:50进行;15:52差异:20160511155200_diff.bak;15:54差异:20160511155400_diff.bak;


15:56差异:20160511155600_diff.bak;15:58差异:20160511155800_diff.bak;


那么,假设希望还原到15:56之前的数据,按上面例子即可。 


注:差异备份是相对上次完整备份来进行备份的,如:20160511155600_diff.bak 备份了15:50至15:56 期间的数据变化。




3、还原到某个时间点(可精确到秒)

restore DATABASE Test  from disk=N'F:\DBBackUp\Test\20160511155000_full.bak'  WITH NORECOVERY, REPLACE,
move 'Test'  to 'F:\DBBackUp\新建文件夹\Test.mdf',
move 'Test_log' to 'F:\DBBackUp\新建文件夹\Test_log.ldf'

GO
RESTORE DATABASE Test FROM DISK= N'F:\DBBackUp\Test\20160511155000_full.bak' WITH NORECOVERY
GO
RESTORE DATABASE Test FROM DISK= N'F:\DBBackUp\Test\20160511155600_diff.bak' WITHNORECOVERY 
GO

--使用日志恢复数据库到10月15日15:59分:



RESTORE LOG Test


--精确到秒钟还原点




二、备份


1、差异:backup database @DbName to disk=@FileName with differential --差异备份数据库


2、完整:backup database @DbName to disk=@FileName with init 


3、日志:BACKUP LOG @DbName  TO DISK = @strbackup WITH INIT;




1).差异备份是以上一个全备为基点,这个期间所有差异数据的备份。
2).日志备份是基于前一个全备+日志备份为基点,这个期间的事务日志的备份。
3).在利用全备+日志备份时,需要有序并逐个还原所有日志备份。假设要还原周六的数据,则需要上周日的全备和周一到周六的所有日志备份才可以。如果有每天的差异备份,则只需要周日的全备+周五的差异备份+周六的日志备份即可。 



DECLARE @FileName nvarchar(255)= 'D:\' 

  DECLARE @DbName nvarchar(30) = 'Ciyt' 

  DECLARE @DateStr nvarchar(20) = replace(replace(replace(CONVERT(varchar, getdate(), 120 ),'-',''),' ','_'),':','') 



  SET @FileName = @FileName + @DbName + '_' + @DateStr +'.bak' 

  backup database @DbName to disk=@FileName with init