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?
quelle
Antworten:
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.
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
quelle