A fortiori, on peut dire Oui :)
Aprés on peut dire aussi “Surtout le dernier, en fait !”

Vraiment le dernier dernier ? :) Et si je l’ai plus ce dernier là ??

Nous savons tous que le dernier rempart protégeant votre base de données reste la stratégie de sauvegarde que vous avez mis en place.

On peut imaginer une stratégie (pour un mode de récupération complet) basée sur une sauvegarde complète, plus un ou deux différentiel, et enfin les sauvegardes du transaction log.

Je reprends un schéma de MSDN pour illustrer ce cas simple :

image

Un client m’a posé la question suivante :

Que se passe t’il si je perds le dernier backup full ? Puis-je tout de même remonter la base jusqu’au dernier log ? '(à supposer qu’au final je n’ai perdu que le dernier backup full mais pas les logs qui ont suivi)

Bon ok c’est tordu, mais ce qui est aussi intéressant c’est savoir si le backup contiendrait des informations indispensables entre le log qui le précède et le log qui lui succède.

J’ai donc monté un petit script de test, simplissime pour évaluer la situation :

   1: INSERT [dbo].[Employe] ([EmployeId], [Nom], 
   2:     [Prenom], [NumeroCarteCredit]) 
   3: VALUES (N'37cb101c-f2f9-4f28-b9f6-10e4193849ff', 
   4:     N'Pertus', N'Sébastien', N'1234-2344-2333-45555')
   5: Go
   6:  
   7: /*** Premier backup Complet ***/
   8: BACKUP DATABASE [bBackupStrategie] 
   9: TO DISK = N'C:\Projects\Backup\bBackupFull1.bak' 
  10:  
  11:  
  12: Update [dbo].[Employe] 
  13: Set [NumeroCarteCredit] = '1234-2344-2333-888888' 
  14: Where EmployeId= '37cb101c-f2f9-4f28-b9f6-10e4193849ff'
  15: Go
  16: /*** Premier backup Transactionnel ***/
  17: BACKUP LOG [bBackupStrategie] 
  18: TO  DISK = N'C:\Projects\Backup\bBackupTrans1.trn' 
  19:     
  20: GO
  21: Update [dbo].[Employe] 
  22: Set [NumeroCarteCredit] = '1234-2344-2333-777777' 
  23: Where EmployeId= '37cb101c-f2f9-4f28-b9f6-10e4193849ff'
  24: Go
  25: /*** Deuxième backup Transactionnel ***/
  26: BACKUP LOG [bBackupStrategie] 
  27: TO  DISK = N'C:\Projects\Backup\bBackupTrans2.trn' 
  28:  
  29: /*** Deuxième backup Complet ***/
  30: BACKUP DATABASE [bBackupStrategie] 
  31: TO DISK = N'C:\Projects\Backup\bBackupFull2.bak' 
  32:     
  33: Update [dbo].[Employe] 
  34: Set [NumeroCarteCredit] = '1234-2344-2333-666666' 
  35: Where EmployeId= '37cb101c-f2f9-4f28-b9f6-10e4193849ff'
  36: Go
  37: /*** Troisième backup Transactionnel ***/
  38: BACKUP LOG [bBackupStrategie] 

Ok à partir de là, on voit que j’ai 2 backups full et plusieurs transaction Logs

Je vais donc tenter de restaurer ma base de données sans le dernier backup full.

Il me faut donc le premier backup Full ainsi que l’ensemble des transactions logs jusqu’au dernier (sans oublier le tail log que j’inclus dans ma procédure de restauration)

Et voilà ce que ça donne :

   1: USE master;
   2: GO
   3:  
   4: /*** Sauvegarde du tail log ***/
   5: BACKUP LOG [bBackupStrategie] 
   6: TO  DISK = N'C:\Projects\Backup\bBackupTailLog.trn' WITH  NO_TRUNCATE,  NORECOVERY
   7: GO
   8:  
   9: /**** Restauration à partir du 1er Backup complet (et non pas le dernier) ***/
  10: RESTORE DATABASE [bBackupStrategie] 
  11: FROM  DISK = N'C:\Projects\Backup\bBackupFull1.bak'
  12: WITH  FILE = 1,  NORECOVERY
  13: GO
  14: RESTORE LOG [bBackupStrategie] 
  15: FROM  DISK = N'C:\Projects\Backup\bBackupTrans1.trn' 
  16: WITH  FILE = 1,  NORECOVERY
  17: GO
  18: RESTORE LOG [bBackupStrategie] 
  19: FROM  DISK = N'C:\Projects\Backup\bBackupTrans2.trn' 
  20: WITH  FILE = 1,  NORECOVERY
  21: GO
  22: /*** Depart hypothétique si le dernier backup était accessible ***/
  23: --RESTORE DATABASE [bBackupStrategie] 
  24: -- FROM  DISK = N'C:\Projects\Backup\bBackupFull2.bak' 
  25: -- WITH  FILE = 1,  NORECOVERY
  26: --GO
  27:  
  28: RESTORE LOG [bBackupStrategie] 
  29: FROM  DISK = N'C:\Projects\Backup\bBackupTrans3.trn' 
  30: WITH  FILE = 1,  NORECOVERY
  31: GO
  32: RESTORE LOG [bBackupStrategie] 
  33: FROM  DISK = N'C:\Projects\Backup\bBackupTailLog.trn'
  34: WITH  FILE = 1, RECOVERY
  35:  
  36: GO

Et là miracle (ou pas) tout se déroule correctement.

Résultat, le backup complet ne compromets pas la cohérence des données dans le Transaction log.

Bon ce cas de figure est un peu tordu, je vous le concède, mais il a le mérite d’éclaircir un point sous-jacent non négligeable, lui.

Voici le lien vers le source complet de ce script : http://www.dotmim.com/SiteFiles/TipsBackupWithoutLastBackup.sql.txt

Bon backup !