La notion de device (unité de sauvegarde) a quasiment disparue des manuels de formation officiels de SQL Server. C’est à mon sens une hérésie, d’autant plus que les actuels dba sont de plus en plus boutonneux (je devrais dire juvéniles…) et désorganisés.
Or le device est le moyen le plus efficace pour ne pas perdre toutes ses sauvegardes lorsque l’on établis un plan comportant différents types de sauvegardes.
Mais au fait… qu’est ce qu’un device ?
En fait un device est un super fichier dans lequel on peut stocker tous les fichiers de son plan de sauvegardes…
Ainsi, récupérer une base de données sera grandement facilité par le fait qu’il n’y aura jamais qu’un seul fichier à manipuler pour la restauration.
Démonstration avec un script de base :
-- pour que cet exemple fonctionne, il faut placer la base de données
-- AdventureWorks en mode de journalisation FULL
ALTER DATABASE AdventureWorks
SET RECOVERY FULL
GO
-- ajout d'un device
EXEC sp_addumpdevice 'disk',
'DVC_backup_advw',
'C:\mes_sauvegardes\dvc.toto'
GO
-- il n'est pas nécessaire que le répertoire existe à ce moment...
-- lançons un premier backup :
BACKUP DATABASE AdventureWorks
TO DVC_backup_advw
GO
-- erreur ! :
/*
Msg 3201, Niveau
16, État 1, Ligne 1
Impossible d'ouvrir l'unité de sauvegarde 'DVC_backup_advw(C:\mes_sauvegardes\dvc.toto)'. Erreur 3(Le chemin d'accès spécifié est introuvable.) du système d'exploitation.
Msg 3013, Niveau 16, État 1, Ligne 1
BACKUP DATABASE s'est terminé anormalement.
*/
-- normal, nous n'avons pas créé le répertoire. Créons le avec SQL Server (c'est plus simple !)
EXEC xp_cmdshell 'MKDIR "C:\mes_sauvegardes\"'
GO
-- la sauvegarde complète fonctionne maintenant parfaitement
BACKUP DATABASE AdventureWorks
TO DVC_backup_advw
GO
/*
21928 pages traitées pour la base de données 'AdventureWorks', fichier 'AdventureWorks_Data' dans le fichier 1.
16 pages traitées pour la base de données 'AdventureWorks', fichier 'f1' dans le fichier 1.
32 pages traitées pour la base de données 'AdventureWorks', fichier 'f2' dans le fichier 1.
64 pages traitées pour la base de données 'AdventureWorks', fichier 'f3' dans le fichier 1.
8 pages traitées pour la base de données 'AdventureWorks', fichier 'f4' dans le fichier 1.
8 pages traitées pour la base de données 'AdventureWorks', fichier 'f5' dans le fichier 1.
2 pages traitées pour la base de données 'AdventureWorks', fichier 'AdventureWorks_Log' dans le fichier 1.
BACKUP DATABASE a traité avec succès 22058 pages en 19.850 secondes (9.103 Mo/s).
*/
-- amusons nous à sauvegarder les bases de données système master et msdb :
BACKUP DATABASE master
TO DVC_backup_advw
GO
BACKUP DATABASE msdb
TO DVC_backup_advw
GO
-- modifions quelques données de la base AdventureWorks
UPDATE AdventureWorks.Person.Contact
SET FirstName = UPPER(FirstName)
GO
-- nous pouvons maitenant faire une sauvegarde différentielle
BACKUP DATABASE AdventureWorks
TO DVC_backup_advw
WITH DIFFERENTIAL
GO
/*
1192 pages traitées pour la base de données 'AdventureWorks', fichier 'AdventureWorks_Data' dans le fichier 4.
8 pages traitées pour la base de données 'AdventureWorks', fichier 'f1' dans le fichier 4.
8 pages traitées pour la base de données 'AdventureWorks', fichier 'f2' dans le fichier 4.
8 pages traitées pour la base de données 'AdventureWorks', fichier 'f3' dans le fichier 4.
8 pages traitées pour la base de données 'AdventureWorks', fichier 'f4' dans le fichier 4.
8 pages traitées pour la base de données 'AdventureWorks', fichier 'f5' dans le fichier 4.
2 pages traitées pour la base de données 'AdventureWorks', fichier 'AdventureWorks_Log' dans le fichier 4.
BACKUP DATABASE WITH DIFFERENTIAL a traité avec succès 1234 pages en 1.418 secondes (7.129 Mo/s).
*/
-- comme on le constate, cette sauvegarde concerne beaucoup moins de page que la complète.
-- encore une modification pour tester la sauvegarde de journal
UPDATE AdventureWorks.Person.Contact
SET LastName = UPPER(LastName)
GO
-- et maintenant une sauvegarde du journal de transaction pour achever le tout.
BACKUP LOG AdventureWorks
TO DVC_backup_advw
GO
Intéressons nous maintenant à savoir ce que contient ce super fichier…
-- métadonnées du device :
RESTORE LABELONLY
FROM DVC_backup_advw
-- on peut les obtenir de la même façon en utilisant un accès directe au fichier
-- si le device n'est pas connu du serveur par exemple
RESTORE LABELONLY
FROM DISK = 'C:\mes_sauvegardes\dvc.toto'
GO
-- plus intéressant est la commande permettant d'avoir des informations sur le contenu du device :
RESTORE HEADERONLY
FROM DVC_backup_advw
-- nous y voyons toutes les sauvegardes, qui les a faites, à quelle heure, quelle base est concernée, quel type de sauvegarde c'est...
-- notez la colonne position du résultat de cette commande, elle va nous être utile par la suite...
-- enfin, on peut connaître les éléments d'une sauvegarde en particulier.
-- pour cela il faut indiquer la sauvegarde en faisant référence à sa position dans le device
RESTORE FILELISTONLY
FROM DVC_backup_advw
WITH FILE = 3
La restauration devient alors jeu d’enfant, car quelle que doit le nombre des fichiers à passer en restauration ils se trouvent tous dans le même device !
***
Frédéric BROUARD – SQLpro – MVP SQL Server
Spécialiste SQL/BD modélisation de données
SQL & SGBDR http://sqlpro.developpez.com/
Expert SQL Server : http://www.sqlspot.com
audits – optimisation – tuning – formation