Online-Seitenwiederherstellung erreicht das 1000-Limit


13

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 CHECKDBBefehle 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 CHECKDBAusgabe 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 RECOVERYaber 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 NORECOVERYalles 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 SELECTAbfragen 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).

Antworten:


16

Das Standardverfahren wäre:

  1. Beziehen Sie die Seiten-IDs, die wiederhergestellt werden müssen.
  2. Starten Sie eine Seitenwiederherstellung mit einer vollständigen Datenbank.
  3. Wenden Sie die letzte differenzielle Sicherung an.
  4. Wenden Sie nachfolgende Protokollsicherungen an.
  5. Erstellen Sie eine neue Protokollsicherung.
  6. Stellen Sie die neue Lob-Sicherung wieder her.

Nachdem die neue Protokollsicherung angewendet wurde, ist die Seitenwiederherstellung abgeschlossen und die Seiten können verwendet werden.

Beispiel Wiederherstellen

RESTORE DATABASE <database> PAGE='1:57, 1:202, 1:916, 1:1016'  
   FROM <file_backup_of_file_B>   
   WITH NORECOVERY;  
RESTORE LOG <database> FROM <log_backup>   
   WITH NORECOVERY;  
RESTORE LOG <database> FROM <log_backup>   
   WITH NORECOVERY;   
BACKUP LOG <database> TO <new_log_backup>;   
RESTORE LOG <database> FROM <new_log_backup> WITH RECOVERY;  
GO  

Referenz: Wiederherstellen von Seiten (SQL Server) (Microsoft Docs) Referenz: RESTORE-Anweisungen (Transact-SQL) (Microsoft Docs)

Sie haben jedoch Lücken in Ihren TLOG-Sicherungen, und das Wiederherstellen mit dem oben beschriebenen Verfahren kann Ihre Datenbank in einen Zustand zurückversetzen, den Sie nicht wünschen.


Sie befinden sich in einer komplizierten Situation.

  1. Ihre Datenbank enthält beschädigte Seiten, und Ihr Unternehmen fügt einer Datenbank ständig neue Daten hinzu, bei denen Probleme auftreten. Dies kann zu einem Totalausfall der Datenbank führen. Willst du das riskieren?

  2. Jemand wird dafür verantwortlich gemacht, und je mehr Sie versuchen, das Problem zu beheben, desto eher kann das Management entscheiden, ob Sie am Ende diese Person sind. Willst du das riskieren?

  3. Sie geraten in eine schwierige Situation, indem Sie eine Rolle übernehmen, für die Sie nicht angestellt waren. Sie versuchen etwas zu erreichen, zu dem weder Ihre Unternehmens-DBAs noch Ihr externer Berater in der Lage waren. Während es eine noble Geste zu sein scheint, setzen Sie sich selbst einem Risiko aus. Möglicherweise haben Sie etwas "implizit versprochen", das Sie niemals erfüllen können. Willst du das riskieren?

  4. Wenn jemand, der mit der Datenbank arbeitet, beschädigte Daten abfragt, wird möglicherweise eine Fehlermeldung angezeigt. Die tägliche Arbeit ist bereits in Mitleidenschaft gezogen. Je länger Sie mit dem Unvermeidlichen warten, desto mehr wird die Produktivität beeinträchtigt. Willst du das riskieren? (Diese Frage könnte auch beim Management gestellt werden.)

  5. Die Sicherungsprozedur Ihres Unternehmens scheint fehlerhaft zu sein (andernfalls fehlen TLOG-Sicherungen?), Und Sie führen Ihre Produktionsdatenbank immer noch so aus, als gäbe es keine Probleme. Willst du das riskieren?

Die beste Empfehlung, die ich Ihnen geben kann, ist, die Produktion einzustellen und Microsoft anzurufen! Oder zumindest Microsoft anrufen und möglicherweise die Produktion einstellen.

Während mein Schreiben aus Ihrer Sicht übermäßig zurückhaltend und leicht dramatisch wirkt, kann ich mich persönlich auf eine Erfahrung als DBA beziehen, bei der Daten in einer ähnlichen Situation verloren gingen. Wir haben nur Daten für einen halben Tag verloren, mussten aber viele Daten erneut mit den umgebenden Systemen synchronisieren .

Je länger Sie warten, desto teurer kann die Wiederherstellung werden.


In Bezug auf die Einschränkung der Seitenwiederherstellung hier ein Zitat aus der offiziellen Dokumentation:

Die maximale Anzahl von Seiten , die in einer Wiederherstellungssequenz in einer einzelnen Datei wiederhergestellt werden können, beträgt 1000 . Wenn Sie jedoch mehr als eine kleine Anzahl beschädigter Seiten in einer Datei haben, sollten Sie in Erwägung ziehen, die gesamte Datei anstelle der Seiten wiederherzustellen.

( Hervorhebung von mir)

Referenz: RESTORE-Anweisungen - Argumente (Transact-SQL) (Microsoft Docs)


Wenn alles wieder normal ist, möchten die Datenbankadministratoren und / oder externen Berater möglicherweise eine andere Sicherungs- / Wiederherstellungsrichtlinie / -prozedur für Ihre Datenbank implementieren. Da es rund um die Uhr verfügbar sein muss, können Sie nicht riskieren, ein Sicherungsverfahren zu verwenden, das für keine Situation ausreichende Wiederherstellungsfunktionen bietet.


2
Die meisten Ihrer Bedenken habe ich bereits angesprochen und beseitigt (ich bin sicherlich nicht verantwortlich, wenn etwas schief geht, die Produktion eingestellt werden sollte usw.). Ich habe mir diesbezüglich sehr klar gemacht, aber ich habe dort keine Kontrolle oder Entscheidung. Ich denke nicht, dass es übermäßig vorsichtig oder dramatisch ist. Ich denke, sie machen im Grunde genommen etwas falsch und ich versuche hier nur zu helfen, aber ohne Kompromisse. Ich verstehe das 1000-Seiten-Limit, aber ich habe gehofft, dass es sich um einen einzelnen Wiederherstellungsbefehl handelt (da ich es online mache, habe ich gehofft, dass ich nicht in einer Sequenz bin ... Ich konnte die Dokumente nicht klarstellen) .
Jcl

1

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:

  • Repariert beschädigte SQL-Datenbankdateien (.mdf & .ndf)
  • Stellt Tabellen, Trigger, Indizes, Schlüssel, Regeln und gespeicherte Prozeduren wieder her
  • 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

  • Ermöglicht das Speichern reparierter Dateien in den Formaten MSSQL, HTML, XLS und CSV
  • Unterstützt MS SQL Server 2016, 2014, 2012, 2008 und ältere Versionen

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! :)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.