Durch das Wiederherstellen der differenziellen Sicherung wird eine DEFUNCT-Protokolldatei erstellt.

11

Hier ist mein Problem. Ich versuche, eine Datenbank über eine vollständige Wiederherstellung auf einen neuen Server zu verschieben und dann mit einer schnellen differenziellen Sicherung / Wiederherstellung zu wechseln. Ich kann problemlos eine vollständige Wiederherstellung durchführen, aber beim Wiederherstellen der differenziellen Sicherung wird die folgende Warnung angezeigt:

Meldung 3127, Ebene 16, Status 1, Zeile 1 Die Datei 'Database_Log2' der wiederhergestellten Datenbank 'DatabaseName' bleibt im nicht mehr gültigen Status, da die Datenbank das einfache Wiederherstellungsmodell verwendet und die Datei für den Lese- / Schreibzugriff markiert ist. Daher können nur schreibgeschützte Dateien durch stückweise Wiederherstellung wiederhergestellt werden.

Die Datenbank wird wiederhergestellt und als online betrachtet, aber jeder Sicherungsvorgang schlägt aufgrund dieser DEFUNCT-Datei mit dem folgenden Fehler fehl:

Nachricht 3636, Ebene 16, Status 2, Zeile 1 Bei der Verarbeitung der Metadaten 'BackupMetadata' für die Datenbank-ID 10, Datei-ID 6, ist ein Fehler aufgetreten. Nachricht 3046, Ebene 16, Status 2, Zeile 1 Es wurden inkonsistente Metadaten festgestellt. Die einzig mögliche Sicherungsoperation ist eine Endprotokollsicherung mit der Option WITH CONTINUE_AFTER_ERROR oder NO_TRUNCATE. Meldung 3013, Ebene 16, Status 1, Zeile 1 Die Sicherungsdatenbank wird abnormal beendet.

Wenn ich FILELISTONLY RESTORE für das vollständige und das Differential durchführe, erhalte ich dieselbe Ausgabe, die mit dem übereinstimmt, was ich in sys.database_files in der Quellendatenbank sehe. Server ist SQL2012 SP1 in der Developer Edition.

Ich kann eine vollständige Sicherung durchführen und unmittelbar danach ein Differential erstellen und diese Dateien in einer anderen Datenbank auf demselben Server wiederherstellen und genau das gleiche Problem feststellen. Es liegt also etwas daran, wie das Differential erstellt wird, das dies verursacht. Wenn ich die vollständige Sicherung mit Wiederherstellung wiederherstelle, gibt es kein Problem. Ich weiß nicht, ob diese Datei in dieser Datenbank vorhanden war, aber es ist durchaus möglich, dass diese Datei früher vorhanden war und vor langer Zeit gelöscht wurde. Wenn ich sys.database_files in der wiederhergestellten Datenbank abfrage, hat die DEFUNCT-Datei einen Wert für drop_lsn, was dies zu bestätigen scheint. Derzeit gibt es in der Quellendatenbank nur eine Dateigruppe (PRIMARY), 4 Datendateien und eine Protokolldatei.

Irgendwelche Ideen?

FilamentUnities
quelle
Können Sie uns bitte die Anweisungen zeigen, mit denen Sie die Sicherungen und Wiederherstellungen durchführen?
Jon Seigel
Nichts Außergewöhnliches. RESTORE DATABASE DatabaseName FROM DISK = 'D: \ Full.bak' MIT REPLACE, NORECOVERY Dann RESTORE DATABASE DatabaseName FROM DISK = 'D: \ Diff.bak' WITH RECOVERY
FilamentUnities

Antworten:

5

Hier sind die Schritte, um dies zu reproduzieren, die in SQL 2012 SP1 Developer Edition getestet wurden. Dies tritt unter SQL 2008 nicht auf. Zusammenfassend lässt sich sagen, dass eine in SQL 2012 erstellte Datenbank, während sich die Modelldatenbank in EINFACHER Wiederherstellung befindet und eine vollständige Sicherung durchgeführt wird, während eine zusätzliche Protokolldatei vorhanden ist, keine verwendbaren differenziellen Sicherungen erstellen kann, wenn diese zusätzliche Protokolldatei vorhanden ist jemals gelöscht.

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

Ich legte einen Connect Artikel zu diesem Problem hier . Die einzige Möglichkeit, diese nicht mehr vorhandene Datei zu entfernen, besteht darin, die Datenbank zu trennen und erneut mit ATTACH_REBUILD_LOG anzuhängen.

UPDATE: Der Fehler, der dieses Szenario in meinem Repro-Skript erstellt, scheint durch diese KB behoben worden zu sein: https://support.microsoft.com/en-us/kb/2830400 . Aus den Kommentaren geht hervor, dass ein zusätzlicher Fix für SQL2012 / 2014 verfügbar ist. Die Szenarien scheinen sehr ähnlich zu sein: https://support.microsoft.com/en-us/kb/3009576

FilamentUnities
quelle
Ich würde Ihr Skript in die Verbindungskommentare aufnehmen, um die Reproduktion zu erleichtern.
Kenneth Fisher
1
Ich erhalte keine Fehler beim Ausführen Ihres Skripts unter SQL Server 2012 Enterprise Edition, 11.0.3412 (CU9 für SP1)
Das Repro-Skript befindet sich im Element Verbinden, wenn Sie auf die Schaltfläche Details klicken.
FilamentUnities
1
Shawn, der die Korrekturen in den CUs durchgesehen hat, hat wahrscheinlich dieses Verhalten behoben: support.microsoft.com/kb/2830400
FilamentUnities
2
Ich hatte letzte Woche einen Kampf mit diesem Thread und dieser Thread hilft mir, ihn zu klären. Vielen Dank. Es sieht so aus, als ob der Fix in SQL 2012 SP2 CU3 ist: support.microsoft.com/en-us/kb/3009576
Richard