Im Laufe des Betriebs einer Datenbank kann es vorkommen, dass diese zu einem Zeitpunkt abstürzt. Mit den richtigen Vorsichtsmaßnahmen stellt das aber kein Problem dar. Entweder wurde über ein Cluster die Arbeit bereits umverteilt, oder es kann ein Backup geladen werden, sodass kaum bis keine Daten verloren gehen. Ein Problem besteht nur, wenn zu selten Backups erstellt werden oder die Datenbank im Simple-Recovery Modus betrieben wird. Der offensichtliche Worst Case ist, wenn Dateien der Datenbank mitsamt des Backups beschädigt werden. Wie man dieses Problem lösen kann, erklären wir in den folgenden Abschnitten.
Ausgangslage
Vor einiger Zeit kam ein Kunde mit genau diesem Problem auf uns zu. Die Ursache des Problems galt es jetzt zu lösen. Es handelte sich um eine Datenbank von SQL Server 2016. Diese lief mit einem angepassten Kompatibilitätslevel auf einer SQL Server 2019 Instanz. Es wurde am Morgen entdeckt, dass diese Datenbank über Nacht ausgefallen war. Jedoch gab es ein Problem damit, diese wieder online zu nehmen. Offenbar waren zudem einige Daten beschädigt. Ein Laden des Backups löste die Situation auch nicht, da auch hier die fehlerhaften Daten enthalten waren. Als Konsequenz musste die Datenbank zunächst auf einen Stand zurückgesetzt werden, der einige Wochen alt war. Dadurch gehen alle zwischenzeitlich vorgenommenen Änderungen verloren. Das gilt für geänderte Daten, aber auch für neu erstellte. Die folgenden Schritte haben wir für die SQL Server Versionen 2019 und 2022 getestet.
Analyse
Damit wir uns ein genaueres Bild des Problems machen konnten, haben wir die beschädigte Datenbank in eine Testumgebung gezogen. Ein erster Schritt der Analyse ist DBCC CHECKDB auszuführen. Wie das geht, haben wir bereits in einem älteren Artikel beschrieben. Wir erhielten Fehlermeldungen, dass Indizes zu keinen Datenreihen passen und dass Schlüssel in den Indizes fehlen. Ein Versuch diese Indizes zu reparieren schlug fehl, da dies nicht das einzige Problem war. Neben den beschädigten DB-Dateien, war auch die Log-Datei beschädigt. Aus diesem Grund haben wir eine neue Datenbank mit der .mdf Datei erstellt. Dadurch kann eine neue saubere Log-Datei erstellt werden. Folgenden Code, haben wir dafür genutzt:
Reparatur
Somit haben wir das erste Problem, nämlich, dass die DB nicht geöffnet werden konnte, gelöst. Jedoch sind immer noch Daten/Tabellen und Indizes beschädigt. Mit dem Befehl
lassen sich zumindest die fehlerhaften Daten/Tabellen reparieren, jedoch können dabei Daten verloren gehen. Da beim Reparieren der Indizes keine Daten verloren gehen, lösen wir zunächst dieses Problem, bevor wir die fehlerhaften Daten und Tabellen reparieren.
Dies ist der Auszug der Analyse durch DBCC CHECKDB
. Hier erkennen wir, welche Objekte die Probleme verursachen. Es kann durchaus vorkommen (wie in der ersten Message) dass keine Namen angegeben werden, sondern nur Object IDs. Mithilfe dieser ID kann das richtige Objekt gefunden werden. Wir verwenden dafür folgenden Befehl:
Mit dieser Info versuchen wir den entsprechenden Index neu zu bauen (Index Rebuild). Jedoch klappte das in diesem Fall nicht. Also löschten wir den Index und erstellen ihn neu. In der SSMS Oberfläche kann man mit Rechtsklick auf den Index das passende Skript erzeugen. Das sieht folgendermaßen aus:
Dieser Vorgang muss für jeden Index vorgenommen werden, der in der Fehlernachricht von DBCC CHECKDB
steht. Eine erneute Analyse mit DBCC CHECKDB
stellt fest, ob noch weitere Probleme bestehen. Sollte das der Fall sein, muss eventuell auf den Reparaturbefehl von oben zurückgegriffen werden. Wenn alle Probleme behoben sind, lässt sich die Datenbank wieder problemlos online stellen. Als Vorsichtsmaßnahme setzen wir die Datenbank direkt in den Full Recovery Modus und erstellen ein neues Backup. Damit hatte unser Kunde wieder die aktuelle Datenbank und das passende Backup dazu.
Fazit
Mit diesen Schritten haben wir Ihnen zeigen können, dass auch bei einer beschädigten Datenbank nicht alle Hoffnung verloren ist. Mit den gezeigten Mitteln kann so manches System wieder gerettet werden. Natürlich ist das Vorgehen für jede Datenbank individuell. Außerdem soll gesagt sein, dass dieses Szenario mit einem richtigen Backupplan verhindert werden kann. Wenn Sie einen solchen Plan benötigen oder Fragen dazu haben, können Sie einen unverbindlichen Termin über unser Kontaktformular ausmachen. Unsere Expert:Innen stehen Ihnen gerne zur Verfügung.