Ich wurde beauftragt, eine Datenbank wiederherzustellen, die beschädigt wurde (aufgrund eines E / A-Fehlers, der seitdem behoben wurde). Ich kenne die Datenbank oder deren Inhalt nicht.
Ich habe eine alte (~ 3 Wochen) vollständige Sicherung und eine Reihe von Transaktionsprotokollen erhalten. Es fehlen jedoch Transaktionsprotokolle, sodass ich nur bis zu einem bestimmten Datum wiederherstellen kann. Es fehlen ungefähr 2,5 Wochen an Daten (und es werden ständig viele Daten zu dieser Datenbank hinzugefügt).
Ich habe auch eine Kopie der beschädigten Datenbank erhalten (die zugänglich ist, aber viele Seiten enthält, die beschädigt sind / fehlen).
Ich habe die typischen DBCC CHECKDB
Befehle ausprobiert (immer noch nein repair_allow_data_loss
, das ist mein letzter Ausweg, wenn nichts anderes funktioniert).
Nachdem viele in die Datenbank gekommen und gegangen sind (die Datenbank ist ein kleines 1,5-Terabyte-Monster und alles, was ich tue, ist langsam und dauert eine Weile), habe ich versucht, eine Online-Seitenwiederherstellung von der letzten als funktionierend bekannten Sicherung für die beschädigten Seiten durchzuführen.
Zu diesem Zweck habe ich ein Skript erstellt, das viele RESTORE DATABASE <foo> PAGE='pages' FROM DISK='<bar.bak>'
Befehle aus der DBCC CHECKDB
Ausgabe erstellt (im Grunde genommen ein regulärer Ausdruck und ein eindeutiger Ausdruck). Bis zu dem Punkt, an dem ich das Limit von 1000 Seiten erreicht habe, hat dies funktioniert pro Datei (es gibt 8 Dateien in dieser Datenbank) pro Wiederherstellungsbefehl.
Daher werde ich aufgefordert, die Online-Wiederherstellung abzuschließen, aber ich weiß nicht, wie das geht. Ich habe kein Abschlussprotokoll oder etwas, das vollständiger ist als das vollständige Backup, mit dem ich beginne Ich weiß im Grunde nicht, wie ich die Wiederherstellung abschließen soll, um den Rest der Seiten durchzuarbeiten.
Ich habe versucht, ein, RESTORE DATABASE <foo> WITH RECOVERY
aber das hat auch nicht funktioniert, es fragt mich nach einem Protokoll, das ich nicht habe.
Hat jemand irgendwelche Tipps, wie ich versuchen könnte, etwas von hier zu erholen? Oder wie kann ich die Online-Wiederherstellung "abschließen", damit ich weiterhin versuchen kann, mehr Seiten wiederherzustellen? Hätte ich das gleiche Problem, wenn ich eine Offline-Wiederherstellung versuchen würde (im Grunde genommen WITH NORECOVERY
alles ergänzen und dann versuchen, es am Ende wieder herzustellen ?)
Das manuelle Herausarbeiten der Datenbank ist im Grunde genommen nicht rückgängig zu machen. Es gibt Hunderte von Tabellen mit Millionen von Zeilen und es gibt keine eindeutige Bedeutung für die einzelnen Tabellen. Die beschädigte Datenbank schlägt bei SELECT
Abfragen nach einigen Millionen Zeilen fehl, aber ich bin nicht sicher, ob ich herausfinden kann, wo. Ich habe versucht, alle nicht gruppierten Indizes neu zu erstellen, aber es gibt beschädigte Seiten mit Zeilendaten, sodass auch das nicht funktioniert hat.
Ein gewisser Datenverlust wäre akzeptabel, aber es sollte zumindest versucht werden, eine Konsistenz in der Datenbank zu erreichen.
Die beschädigte Datenbank ist noch immer online und die Clients arbeiten daran (sodass sie ständig neue Daten abruft). Daher sollte jeder Prozess, den ich auf dem Labortisch mache, später in der Produktionsdatenbank reproduzierbar sein (Ausfallzeiten sind schwierig).
Dies ist SQL Server 2014 Enterprise
PS: Ich bin kein DBA ... Ich bin ein Programmierer, aber der Client hat einige "Experten" für SQL-Disaster-Recovery-Dienste ausprobiert und sie haben aufgegeben tu irgendetwas.
Update : Nach vielen Tests war die seitenweise Wiederherstellung ein Kinderspiel, daher haben wir die Idee verworfen. Wir werden eine manuelle Wiederherstellung durchführen (fehlende Datensätze manuell aus den beschädigten Tabellen auswählen und in die letzte bekannte gute Sicherung einfügen) und einige automatisierte Tools dafür ausführen (es gibt wieder Hunderte und Hunderte von Tabellen).
Ich sehe, dass Sie verschiedene Methoden ausprobiert haben, einschließlich der Arbeit mit Experten für die Datenwiederherstellung, um diese beschädigte Datenbank zu reparieren, insbesondere mit einer Größe von über 1 TB. Dies macht den Prozess viel schwieriger und ein Wettlauf gegen die Zeit. Als erfahrener DBA bin ich auf ähnliche Situationen gestoßen, in denen die meiste Zeit gute Backups zum Wiederherstellen zur Verfügung stehen. Bei der Vererbung fehlerhafter Sicherungen und beschädigter Datenbanken habe ich mich stark auf ein Drittanbieter-Tool namens Stellar Phoenix SQL-Datenbankreparatur-Tool verlassen . Dieses Tool ist bekannt für die Reparatur beschädigter Datenbanken (.mdf und .ndf). Nachfolgend sind die wenigen Funktionen des Tools aufgeführt:
Führt die Wiederherstellung gelöschter Datensätze aus der SQL-Datenbank durch
Speichert das Scan-Ergebnis der Datenbank, um die Wiederherstellung zu einem späteren Zeitpunkt durchzuführen
Das Tool setzt voraus, dass die MDF- und NDF-Dateien offline sind. Daher funktioniert es hervorragend, dass Sie eine Kopie der beschädigten PROD-Datenbank haben und die SQL Server-Dienste nicht beenden müssen.
Das Beste daran ist, dass die Testversion Ihnen die volle Funktionalität des Tools bietet, mit der Ausnahme, dass reparierte Datenbanken nicht exportiert / gespeichert werden können. Sie können weiterhin alle wiederhergestellten Datenbankobjekte und die umfangreiche Reparaturprotokolldatei anzeigen, die Details zu den verschiedenen Phasen des Reparaturprozesses enthält.
Fühlen Sie sich frei zu downloaden und zu sehen, ob es hilft. Hier herunterladen
Ich habe auch einen Blog darüber geschrieben, wie das Tool auf dieser Site funktioniert : samosql-Blogs
Danke und HTH, dass du der HELD des Tages bist!
PS. Wenn dieser Sturm vorüber ist, denken Sie daran, dem Management mitzuteilen, dass die Sicherungsverfahren speziell für eine solche Datenbank grundlegend überarbeitet werden müssen. Eine Wiederholung dieses Szenarios ist völlig inakzeptabel! :)
quelle