Wie sichert man das Log Tail, wenn die Datenbank nicht SQL Server nicht mehr bekannt ist
In meinem Backup-Seminar habe ich erläutert, warum und wie man ein Log Tail Backup macht, wenn eine Datenbank im vollständigen oder massenprotokollierten Wiederherstellungsmodell wiederhergestellt werden muß. Näheres dazu in der Dokumentation und in meinem Backup-Webcast am 22. Februar 2007.
Eine offene Frage, die die Dokumentation so nicht beschreibt ist der Fall: Wie mache ich ein Log Tail Backup, wenn die Datenbank dem Server gar nicht (mehr) bekannt ist. Zum Beispiel, wenn Daten und Logs auf unterschiedlichen Platten oder LUNs liegen (wie man das ja machen soll) und die Daten-Platte beschädigt ist. Dann ist auch master kaputt und SQL Server muß neu installiert werden. Ergebnis: Das Log ist noch da, aber die zugehörige Datenbank ist SQL Server nicht mehr bekannt.
Hier ist das Verfahren. Basis dieses Posts ist dieser Knowledge Base Artikel: https://support.microsoft.com/kb/253817/en-us. Die ganze Beschreibung geht von einer Logdatei aus einer Benutzerdatenbank aus. Analog geht das natürlich auch für mehrere Datenbanken. Voraussetzung ist, dass Ihre (vollständigen und Log-) Sicherungen vorhanden sind, sonst nützt auch das Log Tail Backup nichts.
1. Sichern Sie die Logdatei(en) an einen anderen Ort.
2. Wenn notwendig: Installieren Sie SQL Server bzw. erstellen Sie master neu. Für alles Folgende brauchen Sie einen funktionstüchtigen SQL Server
3. Wenn Sie nicht genau wissen, aus welchen Dateien und Dateigruppen Ihre Datenbank bestand können Sie das mit einem RESTORE FILELISTONLY von einem vollständigen Backup herausfinden:
RESTORE FILELISTONLY
FROM DISK = 'c:\SQLBackup\Northwind_Data.bak'
GO
Die Spalte FileGroupName sagt Ihnen, welche Dateigruppen Ihre Datenbank hatte, die Spalte LogicalName die logischen Namen und die Spalte PhysicalName die Pfade und Namen der Dateien.
4. Erstellen Sie eine Datenbank mit den gleichen Dateigruppen und in den Dateigruppen Dateien mit den gleichen logischen und physischen Dateinamen (gleiche physische Namen sind nicht unbedingt erforderlich, vereinfachen die Situation aber). Die Pfade zu den Dateien können dabei andere sein als bei der ursprünglichen Datenbank.
5. Stoppen Sie den SQL Server Dienst
6. Löschen Sie alle Datendateien der eben erstellten Datenbank. Ersetzen Sie die Logdatei durch die Logdatei Ihrer ursprünglichen Datenbank, von der Sie ein Log Tail Backup machen wollen. Verwenden Sie dazu sicherheitshalber eine Kopie!
7. Setzen Sie die Dateiberechtigungen auf die Logdatei so, dass SQL Server darauf Vollzugriff hat.
8. Starten Sie den SQL Server Dienst
9. Jetzt können Sie normal ein Log Tail Backup machen:
BACKUP LOG Northwind
TO DISK = 'c:\SQLBackup\Northwind_Active_Log.bak' WITH NO_TRUNCATE
GO
10. Löschen Sie die in Punkt 4 erstellte Datenbank mit sp_dbremove oder über das Management Studio.
12. Jetzt können Sie eine normale Wiederherstellung für eine Datenbank im vollständigen Wiederherstellungsmodell ausführen, das heißt zuerst ein RESTORE DATABASE <Datenbankname> FROM DISK = <Dateipfad> WITH NORECOVERY aus einem vollständigen Backup, dann für jede Log-Sicherung, die nach dem vollständigen Backup ausgeführt wurde ein RESTORE LOG <Datenbankname> FROM DISK = <Dateipfad> WITH NORECOVERY und schließlich die Wiederherstellung des (schwer erarbeiteten) Log Tail Backup RESTORE LOG <Datenbankname> FROM DISK = <Dateipfad> WITH RECOVERY
Damit ist die Wiederherstellung abgeschlossen und die Datenbank ist restauriert, ohne dass eine einzige committete Transaktion verloren gegangen ist.
WIe anfangs gesagt ist dieses komplexe Verfahren nur dann notwendig, wenn die Datenbank (wegen kaputter master-Datenbank, wegen notwendiger Neuinstallation oder aus anderen Gründen) für SQL Server nicht mehr sichtbar war. Wenn die Datenbánk im Management Studio noch vorhanden ist kann ein Log Tail Backup direkt erstellt werden, auch wenn alle Datendateien verloren sind.
Gruß,
Steffen