从多个.bak文件还原数据库SQL Server 2012

时间:2018-07-18 20:45:45

标签: sql sql-server sql-server-2012 backup database-restore

第三方向我们发送了分割备份,我们每天需要将这些备份还原到单个数据库中。有没有一种方法可以使维护成本低廉而自动化?

首选项是编写T-SQL或SQL Server作业:

  • AdventureWorks07182018.back0
  • AdventureWorks07182018.back1
  • AdventureWorks07182018.back2
  • AdventureWorks07182018.back3

1 个答案:

答案 0 :(得分:1)

评论时间太长,但这通常是在SQL代理作业中完成的。

拆分备份意味着(至少)4件事中的1件事,如果您还不了解的话,则需要从供应商那里得到澄清。我排除了部分备份:

  1. 供应商将在一天之内发送上面列出的所有备份,这意味着它是基础备份和3个差异或日志备份(可能)
  2. 供应商仅发送差异备份,因为它们最初是向您发送基准的(不太可能)
  3. 供应商将在不同日期(可能是VLDB)备份文件组或文件,并在发生时发送给您(情况不太可能)
  4. 供应商每天向您发送完整备份,其中最后一次备份是最新的(最可能的)

不包括文件和文件组还原,您将:

  1. 还原完整备份
  2. 还原最后个差异备份(如果适用)
  3. 还原在上次差异备份之后或自上次完全备份以来发生的所有日志备份(如果未发生差异)

您还可以在步骤2中选择任何差异,然后选择所有日志备份,因为该差异存在。自然,如果它们仅向您发送完整备份,则只需要还原完整备份。

沿这些方向发生的事情...会因您的环境而异(AlwaysOn,设置为只读,设置为STANDBY等)

ALTER DATABASE AdventureWorks SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO

RESTORE DATABASE [AdventureWorks] FROM  DISK ='\\UNC\AdventureWorks.back0'
WITH
--what ever options... but likely a file move
MOVE 'data_file_1' TO 'E:\somefolder\data.mdf',
MOVE 'db_log' TO 'E:\somefolder\log.ldf',
REPLACE, --overwrites the database
RECOVERY --sets the DB to READ/WRITE. Use NORECOVERY if you need to restore logs / differentials
GO

--if using logs...
RESTORE LOG AdventureWorks
   FROM '\\UNC\AdventureWorks.back01' --assuming this is a log
   WITH FILE = 1,  --this is the first log
   WITH NORECOVERY;  --keep in norecovery to restore other logs...
GO  

等...