7

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

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

此处,明确指定要恢复的备份集。但是,我总是想恢复最新的可用集。默认情况下,它使用第一个备份集。

4

2 回答 2

4

使用 RESTORE HEADERONLY 命令定位您想要的特定备份,因为该结果集显示 BackupFinishDate。注意名为 Position 的字段;那是文件编号。

此时,如果您已经知道逻辑名称,则可以使用 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
;
于 2010-03-31T12:46:21.910 回答
1

增加@Oliver 之前的回答。这是显示 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
于 2013-06-28T12:48:41.437 回答