La principale différence entre les sauvegardes complètes et de copie uniquement est de savoir si le LSN (Log Sequence Number), et en particulier le, DatabaseBackupLSN
est mis à jour.
Lorsque vous effectuez une sauvegarde complète, le DatabaseBackupLSN
est mis à jour. Après avoir effectué la sauvegarde complète, si vous effectuez une sauvegarde différentielle, cette sauvegarde a une DatabaseBackupLSN
qui correspond à celle de la sauvegarde complète, et par conséquent SQL peut lier les deux ensemble (par exemple, il sait à partir de ces LSN que le diff a suivi la totalité).
Le problème survient lorsque vous avez planifié des sauvegardes, vous avez donc une sauvegarde complète initiale, puis une séquence de différentiels. Si vous effectuez manuellement une sauvegarde complète, il mettra à jour le LSN, puis à partir de ce moment, chaque sauvegarde différentielle effectuée via une sauvegarde planifiée fera référence à ce nouveau LSN et non à l'original. En cas de besoin de restauration, vous pouvez restaurer votre sauvegarde complète planifiée, mais lorsque vous essayez de restaurer l'une des sauvegardes différentielles effectuées après le travail manuel, vous constaterez qu'elle échouera car les LSN ne correspondent plus.
Avec une sauvegarde de copie uniquement, elle ne touche pas à DatabaseBackupLSN
, et en tant que telle ne rompt pas cette chaîne de sauvegardes.
Il y a une bonne description du problème, et pourquoi tant de gens le comprennent mal dans Breaking the Backup Chain - REDUX (Or Eating Crow) de Michael K. Campbell, qui comprend de bons guides visuels comme celui-ci:
Pour une bonne explication des quatre LSN différents et de la façon dont ils sont utilisés, consultez la rubrique Présentation des numéros de séquence de journaux SQL Server pour les sauvegardes par Simon Liew.
La façon d'éviter le problème est de ne pas avoir plus d'une chose à faire des sauvegardes standard d'une base de données. Toutes les sauvegardes adhoc ou secondaires doivent être effectuées avec l'option de copie uniquement, voir Sauvegardes de copie uniquement (SQL Server) pour plus de détails, mais vous utilisez essentiellement l'option "Copie de sauvegarde uniquement" dans SSMS, via T-SQL, spécifiez WITH COPY_ONLY
dans la commande ou avec PowerShell, utilisez le -CopyOnly
paramètre.