Master-Datenbank ist beschädigt, Instanz startet nicht - was sind meine Optionen?

11

Hilfe! Meine Master-Datenbank ist beschädigt, ich kann die SQL-Instanz nicht einmal online schalten! Welche Möglichkeiten habe ich, um meinen Server wieder zu sichern?

Ich habe eine Sicherungskopie des Masters, aber auf der MSDN-Seite "Wiederherstellen der Master-Datenbank" werde ich aufgefordert, die Instanz im Einzelbenutzermodus zu starten, was ich nicht tun kann!

(Hinweis: Ich lasse diese Frage in Bezug auf die SQL-Version nicht spezifiziert, um eine allgemein anwendbare Referenz zu sein. Es gibt einige ähnliche Fragen zu DBA.SE, aber keine, bei denen der Server nicht gestartet werden kann.)

BradC
quelle
(Kommentare oder andere Antworten sind sicherlich willkommen, aber ich habe dies gefragt, um eine umfassende Antwort zu geben, einschließlich einiger Aspekte, die ich an keiner anderen Stelle im Internet finden konnte.)
BradC

Antworten:

11

Hier sind einige Möglichkeiten, die ich untersuchen würde. Tun Sie nicht alle (einige davon sind unterschiedliche Techniken, um denselben Zweck zu erreichen), aber es lohnt sich, darüber nachzudenken:

1. Untersuchen Sie das SQL-Fehlerprotokoll direkt

Navigieren Sie direkt zu dem Ordner mit den SQL-Fehlerprotokollen und laden Sie den neuesten ERRORLOGin den Editor, um weitere Informationen darüber zu erhalten, warum die SQL-Instanz nicht gestartet wird. Vielleicht werden Sie feststellen, dass das Problem überhaupt nicht mit der Master-Datenbank zusammenhängt.

2. Versuchen Sie, die Instanz im Einzelbenutzermodus zu starten

Hier finden Sie eine vollständige Liste der Startoptionen für SQL Server , einschließlich -m(Einzelbenutzermodus) und -f(Minimalkonfigurationsmodus). Mit anderen Optionen können Sie den Pfad für die Master-Datenbank angeben, wenn dies das Problem ist.

Wenn Sie die Instanz starten können, befolgen Sie die Schritte in dem MSDN-Artikel, den Sie zum Wiederherstellen der Master-Datenbank verlinkt haben , oder in dieser detaillierten exemplarischen Vorgehensweise von Thomas LaRock .

Wenn eine andere Anwendung immer die Einzelbenutzerverbindung abruft, bevor Sie können, deaktivieren Sie zuerst den SQL-Agenten, damit er nicht gestartet wird. Zweitens finden Sie in den Ideen zu dieser Frage Informationen zur Verwendung des -m"Application Name"Parameters zur Angabe des Anwendungsnamens.

3. Stellen Sie mastereine andere Instanz wieder her und kopieren Sie deren Dateien

Ich habe nur eine weitere Erwähnung dieser undokumentierten Technik gefunden, aber ich habe sie am vergangenen Wochenende erfolgreich angewendet, sodass es möglicherweise einen Versuch wert ist.

Wenn Sie die Instanz nicht im Einzelbenutzermodus starten können, aber eine andere SQL-Instanz mit genau derselben Version und demselben Build ausgeführt wird , versuchen Sie, die letzte bekannte gute Master-Datenbanksicherung von Ihrem toten Server auf der anderen Instanz wiederherzustellen:

  • Stellen Sie natürlich ( master_please_god_let_this_work) als anderen Namen wieder her, WITH MOVEdamit Sie masterIhren guten Server nicht überschreiben
  • Wiederherstellen WITH NORECOVERY. Ich bin mir nicht sicher, ob dies notwendig ist, aber ich fühlte mich besser, als ich wusste, dass der andere Server nichts am wiederhergestellten Master ändern würde
  • Stellen Sie es auf offline: ALTER DATABASE [master_please_god_let_this_work] SET OFFLINE
  • Kopieren Sie die wiederhergestellten MDF- und LDF-Dateien vom guten Server auf den toten Server
  • Benennen Sie die Dateien master.mdfund mastlog.ldfnach Bedarf um, um die fehlerhaften Masterdateien durch Ihre wiederhergestellten Versionen zu ersetzen
  • Drücken Sie die Daumen und starten Sie die Instanz
  • Optional: Führen Sie eine neue Wiederherstellung des Masters auf dem wiederbelebten Server durch. Ich bin mir nicht sicher, ob dies notwendig ist, da wir ziemlich darauf geachtet haben, uns nicht zu ändern master.

4. Erstellen Sie die Systemdatenbanken neu

Wenn auf keiner anderen Instanz dieselbe Version ausgeführt wird oder wenn Sie mit der in # 3 aufgeführten undokumentierten Prozedur nicht vertraut sind oder wenn Sie keine Sicherungen von haben master( warum haben Sie keine Sicherungen? ), Sie können die SQL-Systemdatenbanken von der ursprünglichen Installationsdiskette neu erstellen :

Setup.exe /ACTION=REBUILDDATABASE /...

Wenn dies abgeschlossen ist, können Sie die zuvor verknüpften Schritte ausführen, um mastervon Ihrer letzten guten Sicherung wiederherzustellen . Sie müssen auch eine aktuelle Sicherung von wiederherstellen msdb, um alle Ihre Jobs, den Jobplan und den Jobverlauf beizubehalten.

5. Stellen Sie alle USER-Datenbanken in einer neuen (oder vorhandenen) SQL-Instanz wieder her

Wenn bereits eine andere vorhandene Instanz ausgeführt wird (richtige SQL-Version, genügend Speicherplatz), würde ich wahrscheinlich Datenbankwiederherstellungen von den letzten Sicherungen starten, während ich an den anderen oben beschriebenen Schritten zur Fehlerbehebung arbeite, nur für den Fall, dass ich sie benötige.

Wenn Ihre neue (oder neu installierte) Instanz Zugriff auf dieselbe Festplatte hat, ist es viel schneller, sie einfach als neue Datenbanken anzuhängen:

CREATE DATABASE foo 
ON (FILENAME = 'D:\data\foo.mdf'),
   (FILENAME = 'D:\data\foo_log.ldf')
FOR ATTACH;

6. Nehmen Sie alle Änderungen an erneut vor master

Nach der erfolgreichen Wiederherstellung master(mithilfe einer der oben genannten Techniken) müssen Sie alle Änderungen untersuchen, die möglicherweise verloren gegangen sind, wenn sie nach der soeben wiederhergestellten Sicherung vorgenommen wurden:

  • Sicherheitsänderungen
  • Neue Datenbanken (die Dateien befinden sich weiterhin auf der Festplatte, hängen Sie sie einfach an)
  • Serverweite Einstellungen

Es gibt keinen magischen Weg, diese zu finden. Sie müssen für diese Art von Änderungen zum Dokumentationspfad Ihres eigenen Unternehmens zurückkehren, falls Sie einen haben.

BradC
quelle
1
Netter Post. +1. Ich habe einen Test durchgeführt, bei dem mein Master beschädigt wurde, ein Backup auf einem anderen Server wiederhergestellt und die Dateien dann auf den alten Server kopiert wurden. Es hat ohne Probleme funktioniert. Übrigens habe ich den Fehler 3411 bekommen, während der Master beschädigt war.
Racer SQL
Großartig, danke, dass Sie diese Technik überprüft haben. In meinem Fall wurde nie ein tatsächlicher Fehler angezeigt, aber die Wiederherstellung meiner Master-Datenbank dauerte Stunden, weit über die möglichen Einstellungen für das Zeitlimit für Clusterdienste hinaus.
BradC
1
@RafaelPiccinelli Der Master speichert die "Metadaten" über alles auf dem Server (Sicherheit, andere Datenbanken usw.), so dass dies sinnvoll ist. Siehe meine Punkte 5 und 6. Sie müssen diese Datenbank erneut anhängen und die vorhandene Sicherheit neu einrichten. Übrigens, ich hoffe du machst das alles in einer Laborumgebung !!
BradC
Ja, deshalb der Test. Ich erhalte eine Fehlermeldung, habe aber wahrscheinlich die Erlaubnis in meinem Speicher. wieder schöner post. Ich werde nur diesen letzten Kommentar löschen haha.
Racer SQL