HEADERONLY RESTORE alanından ayıklanıyor


12

Geri yüklemek üzere olduğum yedeklemenin yapıldığı tarihi almak için ' HEADERONLY RESTORE ' u kullanmaya çalışıyorum .

Komuta:

RESTORE HEADERONLY FROM DISK = '<path to .bak file>'

Query Analyzer'da iyi çalışır ve 50 sütun gibi bir sonuç kümesi verir.

Sorun aslında bu koddan erişiyor.

50: ish sütunlarının her birini bildirerek, içine yerleştirerek execve oradan istediğim değeri elde ederek geçici bir tabloya alabilirim .

Sorun şu ki, tüm sonuç kümesini geçici tablo olarak bildirmekten kaçınmak istiyorum, çünkü gelecekteki sürümlerde sütunlar eklerse çok kırılgan bir çözüm gibi görünüyorlar.

Tüm sütunları bildirmeden bu sonuç kümesinden tek bir sütun almanın herhangi bir yolu var mı?

Yanıtlar:


12

Bu benim için çalışıyor.

SELECT BackupStartDate 
FROM OPENROWSET('SQLNCLI',
                'Server=MARTINPC\MSSQL2008;Trusted_Connection=yes;',
'SET NOCOUNT ON;SET FMTONLY OFF;EXEC(''
RESTORE HEADERONLY 
FROM DISK = ''''C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQL2008\MSSQL\Backup\DB1.bak''''
'')'
) 

Ad hoc dağıtılmış sorgular seçeneği etkinleştirilmesi gerekiyor. Veya bunu yapmak istemiyorsanız, geri döngü bağlantılı bir sunucu kurabilir ve bunun yerine kullanabilirsiniz.

EXEC sp_addlinkedserver @server = 'LOCALSERVER',  @srvproduct = '',
                        @provider = 'SQLOLEDB', @datasrc = @@servername

SELECT BackupStartDate 
FROM OPENQUERY(LOCALSERVER, 
               'SET FMTONLY OFF;
               EXEC(''
               RESTORE HEADERONLY 
               FROM DISK = ''''C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQL2008\MSSQL\Backup\DB1.bak''''
'')')

Zekice ve paylaştığınız için teşekkürler, ancak sadece kayıt için bunun sonunda sütunların büyük ole listesi kadar kırılgan / karmaşık olduğunu düşünüyorum. Ne yazık ki zarif bir çözüm yok.
Tim Abell

@TimAbell - Evet Aslında ilk başta tablo tanımını almak dışında bunu pratikte kullanacağımı sanmıyorum.
Martin Smith

1
Her iki sorgu çalışmasını yapamadım. Başka kimse "HEADERONLY RESTORE deyimi meta veri keşfini desteklemediğinden meta veriler belirlenemedi" hata iletisini alıyor mu? sp_describe_first_result_setSistem sp'nin arkasındaki suçlu olduğuna inanıyorum . Ayrıca bu soruyu burada
Stackoverflowuser

@Stackoverflowuser - görünüşe göre bunu bir 2008 örneğine (den MARTINPC\MSSQL2008) karşı test ettim, bu yüzden belki de sonraki sürümlerde bir şey değişti, bu artık çalışmıyor.
Martin Smith

1
@Stackoverflowuser, yukarıdaki örnek sunucu @@ sürüm <2012 olduğunda çalışır. 2012'den başlayarak, bu sorguyu yürütmek yerine, Profiler'da bunu görebilirsiniz: exec [sys] .sp_describe_first_result_set N'SET FMTONLY OFF; EXEC ('' BAŞKANI DİSKTEN GERİ YÜKLE = '' '' C: \ Program Files \ Microsoft SQL Server \ MSSQL10.MSSQL2008 \ MSSQL \ Backup \ DB1.bak '' '' '' ')', NULL, 1
sepupic

7

Bu, bir dosyadan yedekleme tarihini almak için yazdığım bağımsız bir sp.

SQL 2008R2, 2012 ve 2014 için test edilmiştir.

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = 'spGetBackupDateFromFile')
    EXEC ('CREATE PROC dbo.spGetBackupDateFromFile AS SELECT ''stub version, to be replaced''')
GO
/*----------------------------------------------------------------------
                    spGetBackupDateFromFile
------------------------------------------------------------------------
Versie      : 1.0
Autheur     : Theo Ekelmans 
Datum       : 2016-03-31
Change      : Initial release 
------------------------------------------------------------------------*/
alter procedure dbo.spGetBackupDateFromFile(@BackupFile as varchar(1000), @DT as datetime output) as 

declare @BackupDT datetime
declare @sql varchar(8000)
declare @ProductVersion NVARCHAR(128)
declare @ProductVersionNumber TINYINT

SET @ProductVersion = CONVERT(NVARCHAR(128),SERVERPROPERTY('ProductVersion'))
SET @ProductVersionNumber = SUBSTRING(@ProductVersion, 1, (CHARINDEX('.', @ProductVersion) - 1))

if object_id('dbo.tblBackupHeader') is not null drop table dbo.tblBackupHeader

set @sql = ''

-- THIS IS GENERIC FOR SQL SERVER 2008R2, 2012 and 2014
if @ProductVersionNumber in(10, 11, 12)
set @sql = @sql +'
create table dbo.tblBackupHeader
( 
    BackupName varchar(256),
    BackupDescription varchar(256),
    BackupType varchar(256),        
    ExpirationDate varchar(256),
    Compressed varchar(256),
    Position varchar(256),
    DeviceType varchar(256),        
    UserName varchar(256),
    ServerName varchar(256),
    DatabaseName varchar(256),
    DatabaseVersion varchar(256),        
    DatabaseCreationDate varchar(256),
    BackupSize varchar(256),
    FirstLSN varchar(256),
    LastLSN varchar(256),        
    CheckpointLSN varchar(256),
    DatabaseBackupLSN varchar(256),
    BackupStartDate varchar(256),
    BackupFinishDate varchar(256),        
    SortOrder varchar(256),
    CodePage varchar(256),
    UnicodeLocaleId varchar(256),
    UnicodeComparisonStyle varchar(256),        
    CompatibilityLevel varchar(256),
    SoftwareVendorId varchar(256),
    SoftwareVersionMajor varchar(256),        
    SoftwareVersionMinor varchar(256),
    SoftwareVersionBuild varchar(256),
    MachineName varchar(256),
    Flags varchar(256),        
    BindingID varchar(256),
    RecoveryForkID varchar(256),
    Collation varchar(256),
    FamilyGUID varchar(256),        
    HasBulkLoggedData varchar(256),
    IsSnapshot varchar(256),
    IsReadOnly varchar(256),
    IsSingleUser varchar(256),        
    HasBackupChecksums varchar(256),
    IsDamaged varchar(256),
    BeginsLogChain varchar(256),
    HasIncompleteMetaData varchar(256),        
    IsForceOffline varchar(256),
    IsCopyOnly varchar(256),
    FirstRecoveryForkID varchar(256),
    ForkPointLSN varchar(256),        
    RecoveryModel varchar(256),
    DifferentialBaseLSN varchar(256),
    DifferentialBaseGUID varchar(256),        
    BackupTypeDescription varchar(256),
    BackupSetGUID varchar(256),
    CompressedBackupSize varchar(256),'

-- THIS IS SPECIFIC TO SQL SERVER 2012
if @ProductVersionNumber in(11)
set @sql = @sql +'
    Containment varchar(256),'


-- THIS IS SPECIFIC TO SQL SERVER 2014
if @ProductVersionNumber in(12)
set @sql = @sql +'
    Containment tinyint, 
    KeyAlgorithm nvarchar(32), 
    EncryptorThumbprint varbinary(20), 
    EncryptorType nvarchar(32),'


--All versions (This field added to retain order by)
set @sql = @sql +'
    Seq int NOT NULL identity(1,1)
); 
'
exec (@sql)


set @sql = 'restore headeronly from disk = '''+ @BackupFile +'''' 

insert into dbo.tblBackupHeader 
exec(@sql)

select @DT = BackupStartDate from dbo.tblBackupHeader 

if object_id('dbo.tblBackupHeader') is not null drop table dbo.tblBackupHeader

1
Stackoverflow.com/a/31318785/489865 ve support.microsoft.com/en-us/kb/3058865 uyarınca , "SQL SERVER 2014" için eklediğiniz KeyAlgorithm / EncryptorThumbprint / EncryptorType aslında yalnızca SP1'de göründü. Bunun için Build Sürüm olduğuna inanıyorum 12.0.4100.1, bu yüzden kodun SERVERPROPERTY('ProductVersion')doğru bir şekilde hitap etmek için tüm alanlara bakması gerekiyor .
JonBrave

7

Ne tür bir kod belirtmeden sadece 'koddan' verilere erişmeyi sorduğunuzdan, burada PowerShell çözümünü sunuyorum:

Invoke-SQLcmd -Query "RESTORE HEADERONLY FROM DISK = 'R:\SQLFiles\MSSQL.MSSQLSERVER.Backup\Backup.bak'" | Select-Object MachineName,DatabaseName,HasBackupChecksums,BackupStartDate,BackupFinishDate

1
`` Ls | % {$ _. tam ad} | % {invoke-sqlcmd -Query "DİSKTEN BAŞKANI GERİ YÜKLE = '$ _'"}} | format tablosu `
Luiz Felipe

6

Eski moda yol, referans için:

declare @backupFile varchar(max) = 'C:\backupfile.bak';
declare @dbName varchar(256);

-- THIS IS SPECIFIC TO SQL SERVER 2012
--
declare @headers table 
( 
    BackupName varchar(256),
    BackupDescription varchar(256),
    BackupType varchar(256),        
    ExpirationDate varchar(256),
    Compressed varchar(256),
    Position varchar(256),
    DeviceType varchar(256),        
    UserName varchar(256),
    ServerName varchar(256),
    DatabaseName varchar(256),
    DatabaseVersion varchar(256),        
    DatabaseCreationDate varchar(256),
    BackupSize varchar(256),
    FirstLSN varchar(256),
    LastLSN varchar(256),        
    CheckpointLSN varchar(256),
    DatabaseBackupLSN varchar(256),
    BackupStartDate varchar(256),
    BackupFinishDate varchar(256),        
    SortOrder varchar(256),
    CodePage varchar(256),
    UnicodeLocaleId varchar(256),
    UnicodeComparisonStyle varchar(256),        
    CompatibilityLevel varchar(256),
    SoftwareVendorId varchar(256),
    SoftwareVersionMajor varchar(256),        
    SoftwareVersionMinor varchar(256),
    SoftwareVersionBuild varchar(256),
    MachineName varchar(256),
    Flags varchar(256),        
    BindingID varchar(256),
    RecoveryForkID varchar(256),
    Collation varchar(256),
    FamilyGUID varchar(256),        
    HasBulkLoggedData varchar(256),
    IsSnapshot varchar(256),
    IsReadOnly varchar(256),
    IsSingleUser varchar(256),        
    HasBackupChecksums varchar(256),
    IsDamaged varchar(256),
    BeginsLogChain varchar(256),
    HasIncompleteMetaData varchar(256),        
    IsForceOffline varchar(256),
    IsCopyOnly varchar(256),
    FirstRecoveryForkID varchar(256),
    ForkPointLSN varchar(256),        
    RecoveryModel varchar(256),
    DifferentialBaseLSN varchar(256),
    DifferentialBaseGUID varchar(256),        
    BackupTypeDescription varchar(256),
    BackupSetGUID varchar(256),
    CompressedBackupSize varchar(256),        
    Containment varchar(256),
    --
    -- This field added to retain order by
    --
    Seq int NOT NULL identity(1,1)
); 

insert into @headers exec('restore headeronly from disk = '''+ @backupFile +'''');
select @dbName = DatabaseName from @headers;
select @dbName;

1
Bunu SQL2014'te çalıştırmak için, tablonun sonunda şu ek alanlara sahip olmanız gerekir:, Containment tinyint, KeyAlgorithm nvarchar (32), EncryptorThumbprint varbinary (20), EncryptorType nvarchar (32)
Mike

Her şey için varchar kullanmayan ve SQL Server 2014 için fazladan sütunlar içeren bu cevap da var .
Baodad

Bu fazladan sütunların aslında SQL 2014 SP1'e eklendiğini unutmayın . Bunun için Derleme Sürümü olduğuna inanıyorum 12.0.4100.1.
JonBrave
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.