La sauvegarde et restauration partielles

Vous avez une base de données (très) volumineuse ? Vous avez des durées et volumes de sauvegarde excessifs et une restauration risque de durer beaucoup trop longtemps en cas de crash du serveur ? Le volume de la base consiste en grande partie par des données archivées qui ne sont plus jamais modifiées ?

J'ai déjà vu, il y a quelques années, certaines bases de données qui n'étaient plus sauvegardées, faute de trouver une plage de maintenance et un volume de stockage suffisants...

La sauvegarde SQL Server comprend des options avancées qui peuvent résoudre nombre de problèmes...

La sauvegarde partielle est généralement la solution. L'opération consiste à ne sauvegarder régulièrement que des données vivantes (données chaudes) de votre base de données, celles qui peuvent encore faire l'objet de modifications. Les données archivées (données froides) devront être passées en lecture seule : n'étant plus modifiées n'auront besoin d'être sauvegardées qu'une seule fois...

La première mesure à prendre consiste à séparer les données froides des données chaudes sur des groupes de fichiers différents.

Si ces deux catégories de données (chaudes et froides) sont dans des tables différentes (les données qui ne sont plus modifiées sont dans des tables d'archives dédiées), rien de plus simple : il faut déplacer des tables d'un groupe de fichier à un autre. Relisez un de mes articles précédents qui explique comment déplacer ses données d'un filegroup à un autre sans oublier les lobs... On peut même faire cela avec l'option ONLINE, si on possède l'édition Enterprise.

Si elles sont dans la même table, l'opération peut être plus délicate, mais plusieurs solutions existent : séparer les données dans deux nouvelles tables et créer une vue partitionnée pour remplacer la table d'origine, sinon utiliser le partitionnement de table et d'index ce qui reste la solution la plus puissante pour gérer l'archivage périodique.

Avec ces différentes techniques, vous pouvez donc passer certains groupes de fichiers de votre base de données en lecture seule : ceux qui contiennent des archives dans les tables ou les partitions de tables.

Sauvegarder la base :

Votre stratégie de sauvegarde sera la suivante :

  • Un premier backup FULL de la base, mais il est facultatif, purement par sécurité et fait double emploi avec l'étape suivante, car vous allez sauvegarder par la suite l'ensemble des données avec les sauvegardes partielles.
  • Un backup des groupes de fichiers en lecture seule, qui ne sera effectué qu'une seule fois si vous ne repassez jamais ces filegroups en écriture. Chaque fois que vous passez un nouveau groupe de fichiers en lecture seule, sauvegardez le indépendamment de cette façon.
BACKUP DATABASE ma_base FILEGROUP='ARCHIVEFG1', FILEGROUP='ARCHIVEFG2'
, FILEGROUP='ARCHIVEFG3'
TO DISK = 'X:\Backups\MyBackupFileForReadOnlyFG.bak'
  • Un backup périodique de vos groupes de fichiers en lecture/écriture, avec la stratégie de sauvegarde suffisamment fréquente qui vous convient : la sauvegarde partielle peut être FULL ou DIFFERENTIAL et vous y ajouterez bien entendu des sauvegardes de journal de transactions.
BACKUP DATABASE ma_base READ_WRITE_FILEGROUPS 
TO DISK = 'X:\Backups\MyBackupFileForRWFG.bak'
BACKUP DATABASE ma_base READ_WRITE_FILEGROUPS 
TO DISK = 'X:\Backups\MyBackupFileDiffForRWFG.bak' WITH DIFFERENTIAL

BACKUP LOG ... etc...

Restaurer la base :

Pour restaurer la base en cas de crash, l'opération consiste à restaurer en premier lieu la partie Read/Write de la base de données, la sauvegarde FULL, la différentielle et les journaux de transaction. Puis restaurez le reste des groupes de fichiers en lecture seule.

Un cas particulier particulièrement puissant, valable uniquement si vous avez l'édition Enterprise, que l'on appelle "partial piecemeal restore" : vous pouvez mettre en ligne votre base dès que vous avez terminé la restauration des groupes de fichiers en lecture/écriture. Votre base devient donc utilisable beaucoup plus rapidement (sans ses archives) et pendant que les utilisateurs travaillent déjà sur la partie active, vous pouvez continuer la restauration des groupes de fichiers en lecture seule restants. Cela donne ceci :

RESTORE DATABASE ma_base READ_WRITE_FILEGROUPS FROM DISK = 'X:\Backups\MyBackupFileForRWFG.bak' 
WITH PARTIAL, NORECOVERY
RESTORE DATABASE ma_base READ_WRITE_FILEGROUPS FROM DISK = 'X:\Backups\MyBackupFileDiffForRWFG.bak' 
WITH PARTIAL, NORECOVERY
RESTORE LOG ... etc... WITH RECOVERY

Arrivé à ce point, la base est partiellement en ligne. Vous pouvez tranquillement continuer la restauration des autres groupes de fichiers.

RESTORE DATABASE ma_base FILEGROUP='ARCHIVEFG1', FILEGROUP='ARCHIVEFG2'
, FILEGROUP='ARCHIVEFG3' FROM DISK = 'X:\Backups\MyBackupFileForReadOnlyFG.bak' WITH RECOVERY

Une belle amélioration pour le RTO (recovery time objective)...

Testez !

Maintenant, c'est comme tout : les sauvegardes avancées nécessitent de documenter et de tester intégralement votre procédure jusqu'à la restauration, ce serait trop bête d'avoir manqué une étape...

Pour finir, un script d'exemple du partial peacemeal restore : Backups_partial.sql