2010-03-30 113 views
7

我使用相同的.bak文件创建备份。我制作了一个脚本来自动恢复这个备份。使用脚本从bak文件恢复最新备份

RESTORE DATABASE [xxx] FROM DISK = N'xxx.bak' 
WITH FILE = 10, NOUNLOAD, REPLACE, STATS = 10 
GO 

在此,显式指定要还原的备份集。不过,我总是想恢复最新的集可用。默认情况下,它使用第一个备份集。

回答

4

使用RESTORE HEADERONLY命令找到您想要的特定备份,因为该结果集显示BackupFinishDate。请注意名为Position的字段;这是FILE号码。

此时,如果您已经知道逻辑名称,则可以使用WITH子句中的FILE选项运行RESTORE命令。

restore database yourDB 
from disk = N'C:\Program Files\Microsoft SQL Server\yourDB.bak' 
with 
    file = 3 

您可能已经知道您可以使用RESTORE FILELISTONLY命令来查找逻辑名称。

Tibor Karaszi在此发布了一个类似的解决方案:http://www.karaszi.com/SQLServer/util_restore_all_in_file.asp您可以使用他的CREATE TABLE命令将RESTORE HEADERONLY的结果放入表中。我在下面粘贴的内容展示了如何将RESTORE FILELISTONLY的结果放入表格中(也是从Tibor中撕下来的)。

create table FLO_results (
    LogicalName nvarchar(128), 
    PhysicalName nvarchar(260), 
    [Type] char(1), 
    FileGroupName nvarchar(128), 
    Size numeric(20,0), 
    MaxSize numeric(20,0), 
    FileId bigint, 
    CreateLSN numeric(25,0), 
    DropLSN numeric(25,0), 
    UniqueId uniqueidentifier, 
    ReadOnlyLSN numeric(25,0), 
    ReadWriteLSN numeric(25,0), 
    BackupSizeInBytes bigint, 
    SourceBlockSize bigint, 
    FilegroupId bigint, 
    LogGroupGUID uniqueidentifier, 
    DifferentialBaseLSN numeric(25), 
    DifferentialBaseGUID uniqueidentifier, 
    IsReadOnly int, 
    IsPresent int 
) 
; 
insert into FLO_results 
exec(' 
    restore filelistonly from disk = ''C:\Program Files\Microsoft SQL Server\yourDB.bak'' 
') 
; 
select * from FLO_results 
; 
drop table FLO_results 
; 
+0

这是一个很好的提示,我用HEADERONLY选项。 TNX! – Jowen 2010-03-31 14:26:01

+1

逻辑文件名称将根据恢复哪个位置而改变?或者,对于.bak文件中的所有备份集,逻辑文件名总是相同的? – Despertar 2012-05-27 06:13:07

1

增加@Oliver的上一个答案。这是脚本(from here)为您的xxx.bak备份显示HeaderInfo。

DECLARE @HeaderInfo table 
     (
      BackupName nvarchar(128), 
      BackupDescription nvarchar(255) , 
      BackupType smallint , 
      ExpirationDate datetime , 
      Compressed bit , 
      Position smallint , 
      DeviceType tinyint , 
      UserName nvarchar(128) , 
      ServerName nvarchar(128) , 
      DatabaseName nvarchar(128) , 
      DatabaseVersion int , 
      DatabaseCreationDate datetime , 
      BackupSize numeric(20,0) , 
      FirstLSN numeric(25,0) , 
      LastLSN numeric(25,0) , 
      CheckpointLSN numeric(25,0) , 
      DatabaseBackupLSN numeric(25,0) , 
      BackupStartDate datetime , 
      BackupFinishDate datetime , 
      SortOrder smallint , 
      CodePage smallint , 
      UnicodeLocaleId int , 
      UnicodeComparisonStyle int , 
      CompatibilityLevel tinyint , 
      SoftwareVendorId int , 
      SoftwareVersionMajor int , 
      SoftwareVersionMinor int , 
      SoftwareVersionBuild int , 
      MachineName nvarchar(128) , 
      Flags int , 
      BindingID uniqueidentifier , 
      RecoveryForkID uniqueidentifier , 
      Collation nvarchar(128) , 
      FamilyGUID uniqueidentifier , 
      HasBulkLoggedData bit , 
      IsSnapshot bit , 
      IsReadOnly bit , 
      IsSingleUser bit , 
      HasBackupChecksums bit , 
      IsDamaged bit , 
      BeginsLogChain bit , 
      HasIncompleteMetaData bit , 
      IsForceOffline bit , 
      IsCopyOnly bit , 
      FirstRecoveryForkID uniqueidentifier , 
      ForkPointLSN numeric(25,0) NULL, 
      RecoveryModel nvarchar(60) , 
      DifferentialBaseLSN numeric(25,0) NULL, 
      DifferentialBaseGUID uniqueidentifier , 
      BackupTypeDescription nvarchar(60) , 
      BackupSetGUID uniqueidentifier NULL, 
      CompressedBackupSize numeric(20,0) 
    ) 


INSERT INTO @HeaderInfo EXEC('RESTORE HEADERONLY 
FROM DISK = N''xxx.bak'' 
WITH NOUNLOAD') 

SELECT * FROM @HeaderInfo