Diferansiyel yedekleme geri DEFUNCT günlük dosyası oluşturur?


11

İşte benim sorunum. Ben tam bir geri yükleme ile yeni bir sunucuya bir veritabanı taşımak için çalışıyorum, sonra hızlı bir diferansiyel yedekleme / geri yükleme ile kesme. Sorunsuz bir şekilde tam bir geri yükleme yapabilirim, ancak diferansiyel yedeklemeyi geri yüklerken aşağıdaki uyarıyı alıyorum:

Msg 3127, Seviye 16, Durum 1, Satır 1 Geri yüklenen 'DatabaseName' veritabanının 'Database_Log2' dosyası, veritabanı basit kurtarma modelini kullandığından ve dosya okuma-yazma erişimi için işaretlendiğinden geçersiz durumda kalıyor. Bu nedenle, parçalı geri yükleme ile yalnızca salt okunur dosyalar kurtarılabilir.

Veritabanı geri yüklenir ve çevrimiçi kabul edilir, ancak aşağıdaki hata ile bu DEFUNCT dosyası nedeniyle herhangi bir yedekleme işlemi başarısız olur:

Msg 3636, Seviye 16, Durum 2, Satır 1 Veritabanı kimliği 10 dosya kimliği 6 için 'BackupMetadata' meta verileri işlenirken bir hata oluştu. Msg 3046, Seviye 16, Durum 2, Satır 1 Tutarsız meta verilerle karşılaşıldı. Olası tek yedekleme işlemi, WITH CONTINUE_AFTER_ERROR veya NO_TRUNCATE seçeneğini kullanan bir kuyruk günlüğü yedeklemesidir. Msg 3013, Seviye 16, Durum 1, Hat 1 YEDEKLEME VERİTABANI anormal olarak sona eriyor.

Ben tam ve diferansiyel üzerinde bir RESTORE FILELISTONLY yaparsanız, her ikisi de bana aynı çıktı vermek, ben kaynak veritabanındaki sys.database_files gördüklerimle eşleşen. Sunucu, Developer sürümünde SQL2012 SP1'dir.

Tam bir yedekleme yapabilir ve hemen ardından bir diferansiyel yapabilir ve bu dosyaları aynı sunucudaki farklı bir veritabanına geri yükleyebilir ve aynı sorunu görebilirim, bu yüzden diferansiyelin nasıl yaratıldığına dair bir şey var. KURTARMA İLE tam yedeklemeyi geri yüklersem hiçbir sorun yoktur. Bu dosyanın bu veritabanında var olup olmadığını bilmiyorum, ancak bu dosyanın var olması ve uzun zaman önce silinmesi tamamen mümkündür. Geri yüklenen veritabanında sys.database_files sorgulamak, DEFUNCT dosya drop_lsn için bir değer var, bu onaylıyor gibi görünüyor. Şu anda kaynak veritabanında sadece bir dosya grubu (PRIMARY), 4 veri dosyası ve bir günlük dosyası bulunmaktadır.

Herhangi bir fikir?


Lütfen yedekleri ve geri yüklemeleri yapmak için kullandığınız ifadeleri gösterir misiniz?
Jon Seigel

Sıradışı bir şey yok. VERİ TABANI VERİ VeritabanıAdı DISK = 'D: \ Full.bak' DEĞİŞTİR, NORECOVERY İLE RESTORE VERİTABANI VERİ VeritabanıAdı DISK'TEN RESTORE = 'D: \ Diff.bak' KURTARMA İLE
FilamentUnities

Yanıtlar:


5

SQL 2012 SP1 Developer Edition'da test edilen bunu yeniden oluşturma adımları şunlardır. Özetlemek gerekirse, SQL veritabanında örnek veritabanı SIMPLE kurtarma sırasında oluşturulmuş, fazladan bir günlük dosyası varken tam bir yedeğe sahip olan bir veritabanı, bu ekstra günlük dosyası ise kullanılabilir diferansiyel yedeklemeler oluşturamaz. hiç silinmedi.

ALTER DATABASE [model] SET RECOVERY SIMPLE
GO
CREATE DATABASE [DefunctTest]
GO
ALTER DATABASE [DefunctTest] ADD LOG FILE ( NAME = N'DefunctTest_log2', FILENAME = N'D:\DefunctTest_log2.ldf' , SIZE = 25600KB , FILEGROWTH = 10%)
GO
BACKUP DATABASE [DefunctTest] TO DISK = 'D:\DefunctTestPostLogFile.bak' WITH INIT
GO
ALTER DATABASE [DefunctTest]  REMOVE FILE [DefunctTest_log2]
GO

BACKUP DATABASE [DefunctTest] TO DISK = 'D:\DefunctTestFull.bak' WITH INIT
GO
BACKUP DATABASE [DefunctTest] TO DISK = 'D:\DefunctTestDiff.bak' WITH DIFFERENTIAL, INIT
GO
--Show that the backups only have the one log file.
RESTORE FILELISTONLY FROM DISK = 'D:\DefunctTestFull.bak'
RESTORE FILELISTONLY FROM DISK = 'D:\DefunctTestDiff.bak'
GO
RESTORE DATABASE [DefunctTest2] FROM DISK = 'D:\DefunctTestFull.bak' WITH 
MOVE 'DefunctTest' TO 'D:\DefunctTest2.mdf',
MOVE 'DefunctTest_log' TO 'D:\DefunctTest2_log.ldf', REPLACE, NORECOVERY
GO
--This restore will have the error.
RESTORE DATABASE [DefunctTest2] FROM DISK = 'D:\DefunctTestDiff.bak' WITH RECOVERY
GO

USE [DefunctTest2]
SELECT * FROM sys.database_files
GO

Bu hata için buraya bir Connect öğesi gönderdim . Bu geçersiz dosyayı kaldırabilmemin tek yolu veritabanını ayırmak ve ATTACH_REBUILD_LOG ile yeniden eklemek.

GÜNCELLEME: Repro komut dosyamda bu senaryoyu oluşturan hata bu KB tarafından düzeltilmiş gibi görünüyor: https://support.microsoft.com/en-us/kb/2830400 . Yorumlardan SQL2012 / 2014 için ek bir düzeltme mevcut gibi görünüyor, senaryolar çok benzer görünüyor: https://support.microsoft.com/en-us/kb/3009576


Komut dosyanızı insanların çoğalmasına yardımcı olmak için bağlantı yorumlarına eklerdim.
Kenneth Fisher

1
Komut dosyanızı SQL Server 2012 Enterprise Edition, 11.0.3412 (SP1 için CU9) üzerinde çalıştırırken herhangi bir hata almıyorum

Ayrıntılar düğmesini tıklatırsanız, repro komut dosyası Bağlan öğesinde bulunur.
FilamentUnities

1
Shawn, CU's düzeltmeleri bakarak, bu muhtemelen bu davranışı düzeltti düşünüyorum: support.microsoft.com/kb/2830400
FilamentUnities

2
Bu geçen hafta bir savaşım vardı ve bu konu çözmemde bana yardımcı oldu, bu yüzden teşekkür ederim. Düzeltme SQL 2012 SP2 CU3'te görünüyor: support.microsoft.com/en-us/kb/3009576
Richard
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.