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

Wiederherstellen einer SQL Server-Datenbank (T-SQL)

Wenn Sie SQL Server Management Studio (SSMS) oder eine andere GUI zum Verwalten Ihrer Datenbanken verwenden, sind Sie möglicherweise daran gewöhnt, Datenbanken per „Zeigen und Klicken“ zu sichern und wiederherzustellen.

Normalerweise müssen Sie dazu mit der rechten Maustaste auf die Datenbank klicken und Wiederherstellen auswählen oder ähnlich, und folgen Sie dann den Eingabeaufforderungen (z. B. beim Wiederherstellen einer Datenbank in Azure Data Studio).

Aber wenn Sie es jemals mit T-SQL machen müssen, können Sie RESTORE DATABASE verwenden Erklärung.

Beispiel

Hier ist ein einfaches Beispiel:

RESTORE DATABASE World
  FROM DISK = N'/var/opt/mssql/Bak/World.bak' 
  WITH FILE = 1;

Das ist fast so einfach wie es nur geht. Die RESTORE DATABASE Die Anweisung hat eine ziemlich komplexe Syntax (wie bei den meisten T-SQL-Dingen), aber diese Anweisung reicht für eine grundlegende Standardwiederherstellungsoperation aus.

In diesem Fall habe ich eine Datenbank namens World wiederhergestellt aus einer .bak-Datei. Ich habe FROM DISK verwendet um anzugeben, dass es sich um eine .bak-Datei handelt, und ich habe den vollständigen Pfad zu dieser Datei angegeben. Weitere Optionen hier sind FROM TAPE und FROM URL .

Ich habe auch WITH FILE = 1 eingefügt hier, aber das ist sowieso der Standardwert. Diese Klausel gibt die zu verwendende Dateinummer des Sicherungssatzes an. Das heißt, welcher Sicherungssatz in der Datei verwendet werden soll (eine Datei kann mehrere Sicherungssätze haben).

Erhalten Sie eine Liste der Backup-Sätze

Sie können RESTORE HEADERONLY verwenden um eine Liste der Sicherungssätze in der Datei zu erhalten. Genauer gesagt, es gibt eine Ergebnismenge von Backup-Header-Informationen für alle Backup-Sätze zurück.

Beispiel:

RESTORE HEADERONLY
FROM DISK = N'/var/opt/mssql/Bak/WideWorldImporters-Full.bak';

Dies gibt viele Spalten zurück, daher werde ich sie hier nicht alle präsentieren.

Eine der Spalten heißt Position . Dies ist mit dem FILE = zu verwenden Option beim Wiederherstellen der Datenbank.

Beispiel mit mehr Optionen

Hier ist ein Beispiel mit mehr Optionen:

RESTORE DATABASE [WideWorldImporters] 
  FROM DISK = N'/var/opt/mssql/Bak/WideWorldImporters-Full.bak' 
  WITH FILE = 1,  
  MOVE N'WWI_Primary' TO N'/var/opt/mssql/data/WideWorldImporters.mdf',  
  MOVE N'WWI_UserData' TO N'/var/opt/mssql/data/WideWorldImporters_UserData.ndf',  
  MOVE N'WWI_Log' TO N'/var/opt/mssql/data/WideWorldImporters.ldf',  
  MOVE N'WWI_InMemory_Data_1' TO N'/var/opt/mssql/data/WideWorldImporters_InMemory_Data_1',  
  NOUNLOAD,  
  STATS = 5;

Dies ist eigentlich das Skript, das Azure Data Studio für mich generiert hat, als ich die GUI-Oberfläche zum Initiieren eines Wiederherstellungsvorgangs verwendet habe. Wenn Sie dies tun, gibt Ihnen Azure Data Studio die Möglichkeit, die Wiederherstellung sofort auszuführen oder ein Skript mit dem T-SQL-Code zu generieren, das Sie später ausführen können.

In diesem Fall verwendet das Skript den MOVE -Argument, um jeden logischen Dateinamen in der Sicherungsdatei an den angegebenen physischen Dateispeicherort auf dem Betriebssystem zu verschieben. In diesem Fall verwendete die .bak-Datei einen anderen physischen Dateispeicherort (und verwendete Windows-Dateipfade) und musste daher an mein System angepasst werden. Unten finden Sie eine Erklärung, wie Sie diese Informationen erhalten.

Das NOUNLOAD ist eigentlich eine Bandoption. Es stellt sicher, dass das Band nach Abschluss der Wiederherstellung nicht aus dem Laufwerk entladen wird. Da ich nicht von Band wiederherstellte, wurde diese Option ignoriert.

Die STATS Mit dem Argument können Sie den Fortschritt des Wiederherstellungsvorgangs messen. Es gibt an, dass jedes Mal eine Nachricht angezeigt wird, wenn ein anderer Prozentsatz abgeschlossen wird. Wenn Sie hier keinen Prozentwert angeben, zeigt SQL Server eine Meldung an, nachdem alle 10 % abgeschlossen sind.

NUR DATEILISTE WIEDERHERSTELLEN

Wenn Sie eine Anweisung wie die vorherige erstellen möchten, die den MOVE verwendet Argument, um jeden logischen Dateinamen in der Sicherungsdatei an den angegebenen physischen Dateispeicherort auf dem Betriebssystem zu verschieben, können Sie RESTORE FILELISTONLY verwenden um die logischen Dateinamen (und mehr) zurückzugeben.

RESTORE FILELISTONLY gibt einen Ergebnissatz zurück, der eine Liste der Datenbank- und Protokolldateien enthält, die im Sicherungssatz enthalten sind.

Hier ist ein Beispiel, das dieselbe WideWorldImporters .bak-Datei aus dem vorherigen Beispiel verwendet:

RESTORE FILELISTONLY
FROM DISK = N'/var/opt/mssql/Bak/WideWorldImporters-Full.bak';

Ergebnis (bei vertikaler Ausgabe):

-[ RECORD 1 ]-------------------------
LogicalName          | WWI_Primary
PhysicalName         | D:\Data\WideWorldImporters.mdf
Type                 | D
FileGroupName        | PRIMARY
Size                 | 1073741824
MaxSize              | 35184372080640
FileId               | 1
CreateLSN            | 0
DropLSN              | 0
UniqueId             | 8d30f4f9-a463-404f-805a-9bd1c634b66b
ReadOnlyLSN          | 0
ReadWriteLSN         | 0
BackupSizeInBytes    | 11993088
SourceBlockSize      | 512
FileGroupId          | 1
LogGroupGUID         | NULL
DifferentialBaseLSN  | 626000002440500037
DifferentialBaseGUID | 0c5a4141-4a09-4b31-8c83-217870278065
IsReadOnly           | 0
IsPresent            | 1
TDEThumbprint        | NULL
SnapshotUrl          | NULL
-[ RECORD 2 ]-------------------------
LogicalName          | WWI_UserData
PhysicalName         | D:\Data\WideWorldImporters_UserData.ndf
Type                 | D
FileGroupName        | USERDATA
Size                 | 2147483648
MaxSize              | 35184372080640
FileId               | 3
CreateLSN            | 37000000095200001
DropLSN              | 0
UniqueId             | 28d406e0-78ff-4400-9a4b-3a05d136b1f3
ReadOnlyLSN          | 0
ReadWriteLSN         | 0
BackupSizeInBytes    | 434962432
SourceBlockSize      | 512
FileGroupId          | 2
LogGroupGUID         | NULL
DifferentialBaseLSN  | 626000002440500037
DifferentialBaseGUID | 0c5a4141-4a09-4b31-8c83-217870278065
IsReadOnly           | 0
IsPresent            | 1
TDEThumbprint        | NULL
SnapshotUrl          | NULL
-[ RECORD 3 ]-------------------------
LogicalName          | WWI_Log
PhysicalName         | E:\Log\WideWorldImporters.ldf
Type                 | L
FileGroupName        | NULL
Size                 | 104857600
MaxSize              | 2199023255552
FileId               | 2
CreateLSN            | 0
DropLSN              | 0
UniqueId             | 6ac6807e-8774-415b-8efc-e8c569b0855e
ReadOnlyLSN          | 0
ReadWriteLSN         | 0
BackupSizeInBytes    | 0
SourceBlockSize      | 512
FileGroupId          | 0
LogGroupGUID         | NULL
DifferentialBaseLSN  | 0
DifferentialBaseGUID | 00000000-0000-0000-0000-000000000000
IsReadOnly           | 0
IsPresent            | 1
TDEThumbprint        | NULL
SnapshotUrl          | NULL
-[ RECORD 4 ]-------------------------
LogicalName          | WWI_InMemory_Data_1
PhysicalName         | D:\Data\WideWorldImporters_InMemory_Data_1
Type                 | S
FileGroupName        | WWI_InMemory_Data
Size                 | 0
MaxSize              | 0
FileId               | 65537
CreateLSN            | 624000000336200003
DropLSN              | 0
UniqueId             | f65663c8-a250-433e-bbe6-e13a5599a607
ReadOnlyLSN          | 0
ReadWriteLSN         | 0
BackupSizeInBytes    | 980090880
SourceBlockSize      | 512
FileGroupId          | 3
LogGroupGUID         | NULL
DifferentialBaseLSN  | 626000002440500037
DifferentialBaseGUID | 0c5a4141-4a09-4b31-8c83-217870278065
IsReadOnly           | 0
IsPresent            | 1
TDEThumbprint        | NULL
SnapshotUrl          | NULL

Wir können also sehen, dass die physischen Speicherorte dieser Datei Windows-Dateipfade verwenden. Zum Beispiel die erste (mit dem logischen Namen WWI_Primary ) hat den physischen Speicherort D:\Data\WideWorldImporters.mdf .

In meinem Fall habe ich die Datenbank auf SQL Server für Linux wiederhergestellt (der in einem Docker-Container auf meinem Mac ausgeführt wird). Als ich also diese .bak-Datei auf meinem System wiederhergestellt habe, musste ich die physischen Pfade an mein System anpassen.

Natürlich können Sie bei Bedarf auch die Dateipfade bei der Wiederherstellung auf einem Windows-Rechner ändern.

Die vollständige Syntax

Das Sichern und Wiederherstellen von Datenbanken kann je nach Ihren Anforderungen recht aufwendig sein. Das RESTORE Die Anweisung ist so konzipiert, dass sie viele verschiedene Szenarien abdeckt. Insbesondere werden die folgenden Wiederherstellungsszenarien behandelt:

  • Stellen Sie eine vollständige Datenbank aus einer vollständigen Datenbanksicherung wieder her (eine vollständige Wiederherstellung).
  • Stellen Sie einen Teil einer Datenbank wieder her (eine Teilwiederherstellung).
  • Stellen Sie bestimmte Dateien oder Dateigruppen in einer Datenbank wieder her (eine Dateiwiederherstellung).
  • Stellen Sie bestimmte Seiten in einer Datenbank wieder her (eine Seitenwiederherstellung).
  • Ein Transaktionsprotokoll in einer Datenbank wiederherstellen (eine Transaktionsprotokollwiederherstellung).
  • Setzen Sie eine Datenbank auf den Zeitpunkt zurück, der durch einen Datenbank-Snapshot erfasst wurde.

Die vollständige Syntax enthält viele Optionen. Wenn Ihre Anforderungen also den Umfang dieses Artikels überschreiten, sehen Sie sich die Microsoft-Dokumentation für das offizielle RESTORE an Syntax und Erklärung.

Lesen Sie auch Microsofts Überblick über Wiederherstellung und Wiederherstellung, um einen Überblick über die verschiedenen Überlegungen und Ansätze zum Wiederherstellen von Datenbanken zu erhalten.