Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server-Systemdatenbanken – Systemdatenbanken wiederherstellen

In den vorherigen Artikeln der Reihe „SQL Server-Systemdatenbanken“ haben wir den Zweck aller SQL Server-Systemdatenbanken kennengelernt, die Teil der SQL Server-Installation sind, und die Best Practices verstanden, die für sie implementiert werden müssen. Auch die Datenbanken Tempdb und MSDB haben wir genauer verstanden. Da sich das Sichern und Wiederherstellen der Systemdatenbank im Vergleich zu Benutzerdatenbanken geringfügig unterscheidet, werden wir in diesem Artikel ausführlich erläutern, wie Systemdatenbanken gesichert und Systemdatenbanken aus Sicherungen wiederhergestellt werden.

SQL-Datenbank sichern

Der Begriff Sicherung bezieht sich auf das Kopieren der Daten in eine Datenbank als Sicherungsdatei, die zum Wiederherstellen oder weiteren Wiederherstellen der Daten verwendet werden kann.

Eine vollständige Sicherung einer Datenbank enthält die Datenkopien über Datendateien und Protokolldateien, um sie entweder als Datenbank wiederherzustellen oder im Falle von Katastrophen oder katastrophalen Ausfällen die Point-in-Time-Wiederherstellung durchzuführen. Daher sind regelmäßige vollständige Sicherungen des Systems sowie der Benutzerdatenbanken von entscheidender Bedeutung.

Abgesehen von der vollständigen Sicherung unterstützt SQL Server mehrere andere Sicherungsoptionen wie differenzielle Sicherung, Transaktionsprotokollsicherung, Dateisicherung usw., aber wir werden uns nicht auf sie konzentrieren, da sie den Rahmen dieses Artikels sprengen würden.

Eine vollständige Datenbanksicherung sollte so geplant werden, dass sie regelmäßig oder nach bestimmten Konfigurationsänderungen ausgeführt wird. Obwohl SQL Server die vollständige Datenbanksicherung in verschiedenen Dateierweiterungen akzeptieren kann, wird empfohlen, diese Sicherung zur einfacheren Klassifizierung und Wartung als *.bak-Datei zu speichern.

Die Syntax der Sicherungsdatenbank bietet viele Optionen, aber wir konzentrieren uns nur auf die grundlegenden Befehle, die erforderlich sind, um die vollständige Sicherung einer beliebigen Datenbank durchzuführen. Die vollständige Syntax finden Sie im MSDN-Artikel.

DATENBANK-SICHERUNGSSyntax (minimal)

BACKUP DATABASE <Database_name> 
TO DISK = <File_Path>
GO

Benutzerdatenbanken sichern

So erstellen Sie eine vollständige Sicherung von AdventureWorks Datenbank, ersetzen Sie einfach den Datenbanknamen und Dateipfad in den obigen Befehl BACKUP DATABASE und führen Sie ihn aus:

BACKUP DATABASE [AdventureWorks] 
TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\AdventureWorks_Full.bak'
GO

Systemdatenbanken sichern

Mit dem obigen BACKUP DATABASE-Befehl können wir eine vollständige Sicherung von Systemdatenbanken wie master, msdb und model:

erstellen
BACKUP DATABASE master 
TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\master_Full.bak'
GO
BACKUP DATABASE model 
TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\model_Full.bak'
GO
BACKUP DATABASE msdb 
TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\msdb_Full.bak'
GO

Wir können zum obigen Ordnerpfad navigieren und dort sehen wir die vollständigen Datenbanksicherungen, die sowohl für die Benutzerdatenbank als auch für die Systemdatenbanken erfolgreich erstellt wurden:

Ist es möglich, die tempdb-Datenbank zu sichern?

Lassen Sie uns versuchen, eine vollständige Sicherung der tempdb-Systemdatenbank mit der gleichen BACKUP DATABASE-Syntax zu erstellen:

BACKUP DATABASE tempdb 
TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\tempdb_Full.bak'
GO

Wie wir in früheren Artikeln besprochen haben, ist tempdb ist die einzige Datenbank, für die ein Backup kann nicht genommen werden . Die tempdb-Datenbank wird jedes Mal neu erstellt, wenn SQL Server-Dienste gestartet werden. Wenn es also Probleme mit tempdb gibt, hilft ein Neustart des SQL Server-Dienstes, diese zu lösen.

Datenbank wiederherstellen

Das Wiederherstellen einer Datenbank aus einer vollständigen Sicherung (*.bak) bringt die Datenbank mit vollständigen Daten zurück oder „rollt“ eine Datenbank auf einen bestimmten Zeitpunkt zurück. Der RESTORE-Befehl kann auch zum Wiederherstellen von Dateien, Dateigruppen oder Transaktionsprotokollen verwendet werden, ist aber nicht Gegenstand des aktuellen Artikels.

Um eine vollständige Datenbanksicherung wiederherzustellen , können wir die folgende Syntax verwenden. Hinweis:Ähnlich wie der BACKUP-Befehl hat der RESTORE-Befehl viele Optionen, aber wir werden uns nur auf die grundlegenden beziehen. Ausführliche Informationen zu diesen Optionen finden Sie in einem speziellen MSDN-Artikel.

DATENBANK WIEDERHERSTELLEN-Syntax

RESTORE DATABASE <Database_Name> 
FROM  DISK = <File Path>
WITH  REPLACE
GO

Benutzerdatenbank wiederherstellen

Zur Wiederherstellung von AdventureWorks Datenbank aus der zuvor erstellten vollständigen Sicherung, können wir den Befehl RESTORE DATABASE verwenden und den Datenbanknamen ersetzen und Dateipfad wie unten gezeigt:

RESTORE DATABASE [AdventureWorks] 
FROM DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\AdventureWorks_Full.bak' 
WITH REPLACE
GO

Modelldatenbank wiederherstellen

Versuchen wir, die Modellsystemdatenbank mit dem Befehl RESTORE DATABASE wiederherzustellen:

RESTORE DATABASE model 
FROM DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\model_Full.bak' 
WITH REPLACE
GO

Modelldatenbanksicherungen können mit dem Standardbefehl RESTORE DATABASE erfolgreich wiederhergestellt werden.

Master-Datenbank wiederherstellen

Versuchen wir nun, die Systemmaster-Datenbank mit dem Befehl RESTORE DATABASE wiederherzustellen:

RESTORE DATABASE master 
FROM  DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\master_Full.bak' 
WITH  REPLACE
GO

Es hat einen Fehler ausgegeben, der besagt, dass die SQL Server-Instanz im Einzelbenutzermodus ausgeführt werden sollte, um die Master-Datenbank wiederherzustellen. Wie die Fehlermeldung anzeigt, müssen wir unsere SQL Server-Instanz im Einzelbenutzermodus starten und dann versuchen, die Master-Datenbank wiederherzustellen.

Um eine SQL Server-Instanz im Einzelbenutzermodus zu starten, können wir eine der folgenden Methoden anwenden:

  • Eingabeaufforderung
  • SQL Server-Startparameter im SQL Server-Konfigurationsmanager.

Eingabeaufforderungsansatz

Um die SQL Server-Instanz im Einzelbenutzermodus über die Eingabeaufforderung zu starten, öffnen Sie die Eingabeaufforderung mit Als Administrator ausführen Option wie unten gezeigt:

Sobald es fertig ist, geben Sie den Befehl ein:

NET STOP <SQL_Server_Service_Name>

Der SQL_Server_Service_Name kann über den SQL Server Configuration Manager oder services.msc bezogen werden

SQL Server-Konfigurationsmanager

Dienste.msc

Da unser SQL Server-Dienst die Standardinstanz ist, können wir den Namen MSSQLSERVER verwenden wie oben hervorgehoben. Nach der Eingabe werden Sie um eine Bestätigung gebeten, um alle abhängigen Dienste zu stoppen. Wir können den SQL Server Agent Service auch stoppen, indem wir Y eingeben für Ja .

Wenn der SQL Server-Dienst beendet wird, können wir ihn im Einzelbenutzermodus starten. Führen Sie den folgenden Befehl aus, wobei /m bedeutet, dass der SQL Server-Dienst im Einzelbenutzermodus gestartet wird.

NET START MSSQLSERVER /m

Wenn es ausgeführt wird, können wir versuchen, die Master-Datenbank wiederherzustellen. Führen Sie den Befehl RESTORE BACKUP wie zuvor aus:

Durch Starten der SQL Server-Instanz im Einzelbenutzermodus können wir die Master-Systemdatenbank ohne Probleme erfolgreich aus der letzten bekannten vollständigen Datenbanksicherung wiederherstellen. Daher haben wir gelernt, dass sich die SQL Server-Instanz zum Wiederherstellen der Master-Datenbank im Einzelbenutzermodus befinden sollte.

Mit der SQL Server-Instanz im Einzelbenutzermodus kann nur ein Benutzer eine Verbindung herstellen, und nachdem unsere Wiederherstellungsaktivitäten abgeschlossen sind, müssen wir sie wieder in den Mehrbenutzermodus ändern, indem wir die SQL Server-Instanz stoppen und die SQL Server-Instanz wie gezeigt ohne /m-Option starten unten:

NET STOP MSSQLSERVER
NET START MSSQLSERVER

Nach dem Start im normalen Modus oder im Mehrbenutzermodus können sich alle Benutzer mit der SQL Server-Instanz verbinden und ihre Aktivitäten ausführen. Wir können auch überprüfen, ob die Master-Datenbank zu dem Zeitpunkt wiederhergestellt wurde, zu dem die vollständige Sicherung durchgeführt wurde, und dass alle danach vorgenommenen Konfigurationsänderungen erneut durchgeführt werden müssen.

Einige Dinge, die Sie beachten sollten, während sich die SQL Server-Instanz im Einzelbenutzermodus befindet:

  • Wenn sich die SQL Server-Instanz im Einzelbenutzermodus befindet, kann nur eine Benutzersitzung eine Verbindung zu ihr herstellen. Stellen Sie daher sicher, dass der SQL Server Agent-Dienst und alle anderen SQL Server-bezogenen Dienste angehalten sind Status. Andernfalls werden diese Verbindungen möglicherweise zuerst hergestellt, und in diesem Fall können wir keine Verbindung zu SQL Server herstellen, um die Datenbank wiederherzustellen.
  • Trennen Sie bei der Verbindung über SSMS im Einzelbenutzermodus den Objekt-Explorer und verbinden Sie sich nur über das Abfragefenster. Wenn eine Verbindung aus dem Objekt-Explorer hergestellt wird, wird eine einzelne Verbindung hergestellt. Daher können Sie keine Verbindung über das Abfragefenster herstellen. Sehen Sie sich den folgenden Screenshot an – er zeigt, wie Sie nur eine Verbindung zum Fenster „Neue Abfrage“ herstellen, ohne eine Verbindung über den Objekt-Explorer herzustellen:

SQL Server-Startparameter im Konfigurationsmanager

Diejenigen, die mit der GUI anstelle der Eingabeaufforderung vertrauter sind, können den folgenden Ansatz anwenden.

1). Öffnen Sie den SQL Server-Konfigurationsmanager indem Sie MSSQLManager13.msc eingeben in die Eingabeaufforderung. Hier bezieht sich 13 auf SQL Server 2016, verwenden Sie also die richtigen entsprechenden Zahlen für andere Versionen von SQL Server:

  • SQL-Server 2012SQLServerManager11.msc
  • SQL-Server 2014SQLServerManager12.msc
  • SQL-Server 2016SQLServerManager13.msc
  • SQL-Server 2017SQLServerManager14.msc
  • SQL-Server 2019SQLServerManager15.msc

2). Erweitern Sie SQL Server-Dienste :

3). Klicken Sie mit der rechten Maustaste auf den SQL Server-Dienst, der als SQL Server (MSSQLSERVER) gekennzeichnet ist > Eigenschaften .

4). Wählen Sie die Startparameter aus Menüregisterkarte.

5). Klicken Sie auf -m im Startparameter angeben Feld und klicken Sie dann auf Hinzufügen um den SQL Server-Dienst im Einzelbenutzermodus zu starten.

6). Klicken Sie auf OK und starten Sie den SQL Server-Dienst neu, um den SQL Server-Dienst im Einzelbenutzermodus zu starten.

Um die SQL Server-Instanz nach dem Wiederherstellen der Master-Datenbank vom Einzelbenutzermodus in den Mehrbenutzermodus oder den normalen Modus zu ändern, klicken Sie einfach auf den Parameter -m unter Existing Parameter s , Klicken Sie auf Entfernen und starten Sie den SQL Server-Dienst neu.

MSDB-Datenbank wiederherstellen

Versuchen wir nun, die Sicherung der msdb-Systemdatenbank mit dem Standardbefehl RESTORE DATABASE wiederherzustellen:

RESTORE DATABASE msdb 
FROM  DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\msdb_Full.bak' 
WITH  REPLACE
GO

Dieser Versuch führt zu einer Fehlermeldung, die besagt, dass Exklusiver Zugriff nicht möglich war, da die Datenbank verwendet wird . Diese Fehlermeldung weist darauf hin, dass ein anderer Prozess msdb verwendet . Daher müssen wir einen der folgenden Ansätze anwenden, um die msdb-Datenbank korrekt wiederherzustellen:

  • Starten Sie die SQL Server-Instanz oder den Dienst im Einzelbenutzermodus, wie wir es zuvor getan haben, um zu verhindern, dass jemand eine Verbindung herstellt und auf die msdb zugreift Datenbank.
  • Oder bringen Sie die msdb mit Datenbank in den Einzelbenutzermodus, ohne dass sich ein Benutzer damit verbindet.

Da wir wissen, wie die SQL Server-Instanz oder der Dienst beim Wiederherstellen der Master-Systemdatenbank in den Einzelbenutzermodus versetzt wird, versuchen wir die zweite Option, indem wir die msdb-Datenbank in den Einzelbenutzermodus ändern, um die Sicherung der msdb-Datenbank wiederherzustellen.

Führen Sie den folgenden Befehl aus:

USE [master]
GO
ALTER DATABASE [msdb] SET  SINGLE_USER WITH ROLLBACK IMMEDIATE
GO

Wichtig :Die Ausführung des obigen Befehls kann in folgenden Fällen fehlschlagen:

  • Der SQL Server Agent-Dienst ist betriebsbereit. Um den Fehler zu beheben, halten Sie den SQL Server Agent-Dienst an und versuchen Sie es erneut.
  • Alle Benutzersitzungen sind mit der msdb-Datenbank verbunden. Mit der folgenden Abfrage können wir aktive Verbindungen zu msdb oder einer anderen Datenbank ermitteln:
use master
GO
select spid
from sys.sysprocesses
where dbid = db_id('msdb')

Wenn diese Abfrage Ergebnisse liefert, weist dies darauf hin, dass einige Benutzersitzungen mit der msdb-Datenbank verbunden sind. In diesem Fall sollten wir diese Sitzungen mit dem KILL-Befehl beenden und die spid ersetzen erhalten aus der obigen Abfrageausführung:

KILL <spid>

Wenn keine Sitzungen mit msdb verbunden sind Datenbank können wir die msdb-Datenbank erfolgreich in den Einzelbenutzermodus bringen. Immer wenn sich eine Datenbank im Einzelbenutzermodus befindet, können wir das Wort (Einzelbenutzer) in der Nähe der Datenbank sehen, wie unten für die msdb-Datenbank hervorgehoben:

Versuchen wir, die msdb wiederherzustellen Datenbank jetzt mit unserem RESTORE DATABASE-Befehl:

Mit der msdb-Datenbank im Einzelbenutzermodus konnten wir msdb wiederherstellen Datenbank erfolgreich von der letzten als funktionierend bekannten vollständigen Sicherung von msdb Datenbank. Das Wiederherstellen einer Datenbank aus einer Sicherung bringt sie standardmäßig in den Mehrbenutzermodus, und wenn sie sich aus irgendeinem Grund immer noch im Einzelbenutzermodus befindet, können wir den folgenden Befehl ausführen, um sie wieder in den Mehrbenutzermodus zu bringen:

USE [master]
GO
ALTER DATABASE [msdb] SET MULTI_USER
GO

Systemdatenbanken neu aufbauen

Für jede ideale Produktion Umgebungen ist es wichtig, eine vollständige Sicherung der Systemdatenbanken zu haben, um die Systemdatenbanken ohne Datenverlust im Falle von versehentlichen Fehlern durch Benutzer oder Datenbankbeschädigungen oder Notfallwiederherstellung wiederherzustellen.

Im schlimmsten Fall, wenn die SQL Server-Dienste nicht gestartet werden können, müssten wir zuerst versuchen, die Systemdatenbanken aus den letzten bekannten vollständigen Sicherungen wiederherzustellen, und wenn wir keine vollständigen Sicherungen verfügbar haben und die SQL Server-Dienste nicht starten konnten, dann sind wir es Es bleibt nur noch eine letzte Option, d. h. Neuaufbau der Systemdatenbanken. Hinweis :Durch die Neuerstellung von Systemdatenbanken werden alle Konfigurationen auf Serverebene gelöscht, die in allen Systemdatenbanken gespeichert sind, und wir verlieren möglicherweise alle Konfigurationen auf Server-/Instanzebene wie Anmeldungen, SQL Server-Agent-Konfigurationen und andere wichtige Details, die in den Systemdatenbanken gespeichert sind, die wir in unseren vorherigen Artikeln gesehen haben.

Werfen wir einen kurzen Blick darauf, wie Systemdatenbanken neu erstellt werden (wie oben erwähnt, sollte dieser Vorgang als letzte Maßnahme durchgeführt werden, um die SQL Server-Instanz in Ermangelung vollständiger Sicherungen von Systemdatenbanken wiederherzustellen).

Um die Systemdatenbanken neu zu erstellen, benötigen wir die SQL Server-Installationsmedien, die entweder bereitgestellt oder auf den Server kopiert wurden, auf dem unsere SQL Server-Instanz installiert ist. Sobald dies erledigt ist, sollten wir die folgenden Schritte ausführen:

  1. Navigieren Sie in der Eingabeaufforderung zu dem Pfad, in dem sich die Setup-Dateien von SQL Server (setup.exe) befinden:

    C:\Programme\Microsoft SQL Server\130\Setup Bootstrap\SQLServer2016
  2. Führen Sie den folgenden Befehl aus und ersetzen Sie alle Parameter durch gültige Werte. Wert ACTION =REBUILDDATABASE gibt an, dass alle Systemdatenbanken neu aufgebaut werden müssen, nachdem dieser Befehl ausgeführt wurde.
Setup /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=InstanceName /SQLSYSADMINACCOUNTS=accounts [ /SAPWD= StrongPassword ] [ /SQLCOLLATION=CollationName]

Zu ändernde Parameter sind:

  • Instanzname – der Instanzname von SQL Server, in unserem Fall ist es RRJ
  • Konten – der Sysadmin-Kontoname, in unserem Fall ist es sa
  • StrongPassword – ein sicheres Passwort für die sa sysadmin-Konto.
  • CollationName – der Sortierungsname der SQL Server-Datenbank, falls geändert werden muss.

Schlussfolgerung

Wir haben gelernt, wie Benutzer- und Systemdatenbanken gesichert und wiederhergestellt werden, und die zusätzlichen Maßnahmen verstanden, die zum Wiederherstellen von Systemdatenbanken wie master- und msdb-Systemdatenbanken erforderlich sind. Im Falle fehlender vollständiger Sicherungen von Systemdatenbanken haben wir auch gelernt, wie Systemdatenbanken von SQL Server-Installationsmedien neu erstellt werden, und die konfigurationsbezogenen Datenverluste verstanden, die beim Neuaufbau von Systemdatenbanken auftreten. Zusammenfassend haben wir indirekt verstanden, wie wichtig es ist, vollständige Sicherungen für Systemdatenbanken zusätzlich zu Benutzerdatenbanken zu planen.

Vielen Dank für Ihre Zeit und wir werden uns bald mit einem weiteren interessanten Artikel wiedersehen.