Microsoft SQL Server: Point in Time Restore einer Datenbank mit Backup des Transaktionslogs

Aufgrund eines Fehlers musste ich gestern zwei Datenbanken eines Microsoft SQL Servers 2008 wiederherstellen – und das letzte Backup war schon mehrere Stunden alt.

Folgendes Beispiel: Eine Datenbank sowie das zugehörige Transaktionsprotokoll werden täglich um 19:45 Uhr bzw. 19:50 Uhr gesichert. Um 20:00 Uhr ereignet sich ein Fehler und die Datenbank geht kaputt. Die nicht in der Sicherung enthaltenen Änderungen zwischen 19:50 Uhr und 20:00 Uhr sind so kritisch, dass sie wiederhergestellt werden müssen. Wie geht man in so einem Fall vor?

Alle Modifikationen an einer Datenbank werden zusätzlich im dazugehörigen Transaktionsprotokoll gespeichert. In Kombination mit einer Datenbanksicherung können so alle seit dem letzten Backup durchgeführten Änderungen nachvollzogen und wiederhergestellt werden. Voraussetzung ist, dass die entsprechende Datenbank das Wiederherstellungsmodell „Vollständig“ verwendet.

Im Beispiel ist es jetzt 20:15 Uhr und im ersten Schritt wird das aktuelle Transaktionsprotokoll gesichert. Andernfalls können nur Daten bis zum letzten Backup wiederhergestellt werden. Die Sicherung des aktuellen Logfiles vor einer Wiederherstellung wird auch „Tail-Log Backup“ genannt:

    SQL Server 2005 and later versions usually require that you take a tail-log backup before you start to restore a database. The tail-log backup prevents work loss and keeps the log chain intact. When you are recovering a database to the point of a failure, the tail-log backup is the last backup of interest in the recovery plan. If you cannot back up the tail of the log, you can recover a database only to the end of the last backup that was created before the failure. [1]

Das Vorgehen dabei unterscheidet sich nicht von einer normalen Sicherung. Im SQL Server Management Studio wird die entsprechende Datenbank mit der rechten Maustaste angeklickt, mittels Tasks -> Back Up… der Sicherungsassistent gestartet, als Sicherungstyp Transaktionsprotokoll ausgewählt und ein Ziel für die Sicherungsdatei hinzugefügt:

Anschließend wird mit der Wiederherstellung begonnen. Hierbei muss folgendes zwingend beachtet und eingehalten werden:

    Backups must be restored in the order in which they were created. Before you can restore a particular transaction log backup, you must first restore the following previous backups without rolling back uncommitted transactions, that is WITH NORECOVERY:

    • The full database backup and the last differential backup, if any, taken before the particular transaction log backup.
    • All transaction log backups taken after the full database backup or the differential backup (if you restore one) and before the particular transaction log backup. [2]

Als nächstes wird also zuerst das letzte vollständige oder differenzielle Backup der Datenbank wiederhergestellt. Mittels Rechtsklick auf die Datenbank wird mit Tasks -> Restore -> Database erneut der Sicherungsassistent aufgerufen und die entsprechende Sicherung ausgewählt. Wichtig zu beachten gilt, dass hier nur die Datenbanksicherung und kein Transaktionsprotokoll ausgewählt wird:

Unter Optionen wird das Überschreiben der vorhandenen Datenbank aktiviert (WITH REPLACE) und im unteren Bereich ausgewählt, dass zusätzliche Transaktionsprotokolle wiederhergestellt werden sollen (WITH NO RECOVERY):

Nach Abschluss der Wiederherstellung befindet sich die Datenbank auf dem Stand von 19:45 Uhr und im Status „Wird wiederhergestellt“. Mittels Rechtsklick auf die Datenbank und Auswahl von Tasks -> Restore -> Transaction Log… werden im nächsten Schritt die Daten aus den Backups der Transaktionsprotokolle wiederhergestellt.

Im aktuellen Beispiel sind zwei Protokolle vorhanden: Das Log aus der Sicherung von 19:50 Uhr sowie das manuell erstellte Tail-Log aus dem Backup von 20:15 Uhr. Das Protokoll von 19:50 Uhr enthält alle Änderungen zwischen der Datenbanksicherung von 19:45 Uhr und dem Backup des Transaktionsprotokolls um 19:50 Uhr. Das Tail-Log Backup enthält alle Änderungen an der Datenbank, die nach der Sicherung um 19:50 Uhr durchgeführt wurden.

Wie weiter oben beschrieben, werden alle Backups des Transaktionsprotokolls seit der letzten Datenbanksicherung benötigt. Würde das Backup von 19:50 Uhr fehlen, könnten auch die Daten aus dem Backup von 20:15 Uhr nicht wiederhergestellt werden – schließlich enthält das Backup von 19:50 Uhr die Änderungen nach der Datenbanksicherung von 19:45 Uhr, die in dem Tail-Log Backup nicht mehr enthalten sind.

Sofern alle Transaktionsprotokolle vorhanden sind, wird unter Wiederherstellen in ein Zeitpunkt festgelegt. In unserem Beispiel 19:59 Uhr – also unmittelbar vor dem Auftreten des Fehlers um 20:00 Uhr.

Nach abgeschlossener Wiederherstellung sollte sich die Datenbank auf dem Stand von 19:59 Uhr befinden.

Im MSDN Artikel How to: Restore to a Point in Time wird übrigens auch ein Point In Time Restore mit einer Datenbankwiederherstellung beschrieben. Merkwürdigerweise hat das bei mir nicht funktioniert; auch bei Auswahl des genauen Zeitpunkts wurde augenscheinlich immer nur der letztmögliche Stand wiederhergestellt. Hinweise und Tipps diesbzgl. nehme ich gerne entgegen!

[1] MSDN: Tail-Log Backups
[2] MSDN: How to: Restore a Transaction Log Backup (SQL Server Management Studio)

0 Responses to “Microsoft SQL Server: Point in Time Restore einer Datenbank mit Backup des Transaktionslogs”



  1. Schreibe einen Kommentar

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s





%d Bloggern gefällt das: