2010-03-30 12 views
7

Creo i backup utilizzando lo stesso file .bak. Ho creato uno script per ripristinare automaticamente questo backup.Ripristina l'ultimo backup dal file bak con lo script

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

Qui, viene specificato esplicitamente il set di backup da ripristinare. Tuttavia, voglio sempre ripristinare il set più recente disponibile. Per impostazione predefinita, utilizza il primo set di backup.

risposta

4

Utilizzare il comando RESTORE HEADERONLY per individuare il backup specifico desiderato, poiché tale set di risultati mostra BackupFinishDate. Nota il campo denominato Posizione; questo è il numero FILE.

A questo punto, se si conoscono già i nomi logici, è possibile eseguire un comando RESTORE utilizzando l'opzione FILE nella clausola WITH.

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

Probabilmente già sapete che è possibile utilizzare il comando RESTORE FILELISTONLY per trovare i nomi logici.

Tibor Karaszi ha pubblicato una soluzione simile (ma non identica) qui: http://www.karaszi.com/SQLServer/util_restore_all_in_file.asp È possibile utilizzare i suoi comandi CREATE TABLE per ottenere i risultati di RESTORE HEADERONLY in una tabella. Quello che ho incollato in seguito mostra come ottenere i risultati di RIPRISTINA FILELISTONLY in un tavolo (anche strappato da 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

Questo è stato un buon suggerimento, ho usato l'opzione INTESTAZIONE. Tnx! – Jowen

+1

Il nome del file logico cambierà in base alla posizione ripristinata? O il nome del file logico sarà sempre lo stesso per tutti i set di backup in un file .bak? – Despertar

1

Per aumentare @ la risposta precedente di Oliver. Ecco lo script (from here) per mostrare l'HeaderInfo per il tuo backup xxx.bak.

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