Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Restaurer une base de données SQL Server (T-SQL)

Si vous utilisez SQL Server Management Studio (SSMS) ou une autre interface graphique pour gérer vos bases de données, vous avez peut-être l'habitude de sauvegarder et de restaurer des bases de données à l'aide de "pointer et cliquer".

Cela implique généralement un clic droit sur la base de données et la sélection de Restaurer ou similaire, puis suivez les invites (par exemple, lors de la restauration d'une base de données dans Azure Data Studio).

Mais si jamais vous avez besoin de le faire avec T-SQL, vous pouvez utiliser le RESTORE DATABASE déclaration.

Exemple

Voici un exemple de base :

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

C'est presque aussi simple que possible. Le RESTORE DATABASE a une syntaxe assez complexe (comme avec la plupart des choses T-SQL), mais cette instruction est suffisante pour une opération de restauration de base par défaut.

Dans ce cas, j'ai restauré une base de données appelée World à partir d'un fichier .bak. J'ai utilisé FROM DISK pour spécifier qu'il provenait d'un fichier .bak, et j'ai fourni le chemin complet de ce fichier. D'autres options ici incluent FROM TAPE et FROM URL .

J'ai également inclus WITH FILE = 1 ici, mais c'est la valeur par défaut de toute façon. Cette clause spécifie le numéro de fichier du jeu de sauvegarde à utiliser. C'est-à-dire quel jeu de sauvegarde utiliser dans le fichier (un fichier peut avoir plusieurs jeux de sauvegarde).

Obtenir une liste des jeux de sauvegarde

Vous pouvez utiliser RESTORE HEADERONLY pour obtenir une liste des jeux de sauvegarde dans le fichier. Plus précisément, il renvoie un ensemble de résultats d'informations d'en-tête de sauvegarde pour tous les ensembles de sauvegarde.

Exemple :

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

Cela renvoie beaucoup de colonnes donc je ne les présenterai pas toutes ici.

L'une des colonnes s'appelle Position . Ceci doit être utilisé avec le FILE = option lors de la restauration de la base de données.

Exemple avec plus d'options

Voici un exemple avec plus d'options :

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;

Il s'agit en fait du script qu'Azure Data Studio a généré pour moi lorsque j'ai utilisé l'interface graphique pour lancer une opération de restauration. Lorsque vous faites cela, Azure Data Studio vous donne la possibilité d'exécuter la restauration immédiatement ou de générer un script avec le code T-SQL que vous pouvez exécuter ultérieurement.

Dans ce cas, le script utilise le MOVE argument pour déplacer chaque nom de fichier logique dans le fichier de sauvegarde vers l'emplacement de fichier physique spécifié sur le système d'exploitation. Dans ce cas, le fichier .bak utilisait un emplacement de fichier physique différent (et utilisait des chemins de fichiers Windows) et cela a donc dû changer pour s'adapter à mon système. Voir ci-dessous pour une explication sur la façon d'obtenir ces informations.

Le NOUNLOAD est en fait une option de bande. Il garantit que la bande n'est pas déchargée du lecteur une fois la restauration terminée. Étant donné que je n'étais pas en train de restaurer à partir d'une bande, cette option a été ignorée.

Les STATS L'argument vous permet d'évaluer la progression de l'opération de restauration. Il précise qu'un message sera affiché à chaque fois qu'un autre pourcentage se termine. Si vous n'incluez pas de valeur de pourcentage ici, SQL Server affichera un message une fois que chaque tranche de 10 % sera terminée.

RESTAURER LE FICHIER UNIQUEMENT

Si vous vouliez créer une déclaration comme la précédente, qui utilise le MOVE argument pour déplacer chaque nom de fichier logique dans le fichier de sauvegarde, vers l'emplacement de fichier physique spécifié sur le système d'exploitation, vous pouvez utiliser RESTORE FILELISTONLY pour renvoyer les noms de fichiers logiques (et plus).

RESTORE FILELISTONLY renvoie un jeu de résultats contenant une liste de la base de données et des fichiers journaux contenus dans le jeu de sauvegarde.

Voici un exemple utilisant le même fichier WideWorldImporters .bak de l'exemple précédent :

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

Résultat (en utilisant la sortie verticale) :

-[ 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

Nous pouvons donc voir que les emplacements physiques de ce fichier utilisent les chemins de fichiers Windows. Par exemple, le premier (avec un nom logique de WWI_Primary ) a un emplacement physique de D:\Data\WideWorldImporters.mdf .

Dans mon cas, j'ai restauré la base de données sur SQL Server pour Linux (s'exécutant dans un conteneur Docker sur mon Mac). Ainsi, lorsque j'ai restauré ce fichier .bak sur mon système, j'ai dû modifier les chemins physiques en fonction de mon système.

Bien sûr, vous pouvez également modifier les chemins d'accès aux fichiers lors de la restauration sur une machine Windows si nécessaire.

La syntaxe complète

La sauvegarde et la restauration des bases de données peuvent être assez complexes, selon vos besoins. Le RESTORE déclaration est conçue pour couvrir de nombreux scénarios différents. En particulier, il couvre les scénarios de restauration suivants :

  • Restaurer une base de données entière à partir d'une sauvegarde complète de la base de données (une restauration complète).
  • Restaurer une partie d'une base de données (une restauration partielle).
  • Restaurer des fichiers ou des groupes de fichiers spécifiques dans une base de données (une restauration de fichier).
  • Restaurer des pages spécifiques dans une base de données (une restauration de page).
  • Restaurer un journal des transactions sur une base de données (une restauration du journal des transactions).
  • Rétablir une base de données au point dans le temps capturé par un instantané de base de données.

La syntaxe complète contient de nombreuses options, donc si vos besoins dépassent la portée de cet article, consultez la documentation Microsoft pour le RESTORE officiel syntaxe et explication.

Lisez également la présentation de la restauration et de la récupération de Microsoft pour un aperçu des différentes considérations et approches de restauration des bases de données.