Rôle d’enregistreur dans la sauvegarde de magasins complexes

Comme pour toutes les opérations importantes sous VSS, les sauvegardes incrémentielles et différentielles nécessitent une coopération étroite entre les demandeurs et les rédacteurs.

Types de sauvegarde

L’infrastructure fournit une prise en charge spéciale pour cinq types de sauvegarde. En voici le détail :

  • Complet (VSS_BT_FULL). Les fichiers seront sauvegardés quelle que soit leur date de dernière sauvegarde. L’historique de sauvegarde de chaque fichier est mis à jour, et ce type de sauvegarde peut être utilisé comme base d’une sauvegarde incrémentielle ou différentielle. S’il existe des fichiers journaux, ils peuvent être tronqués à la suite de cette sauvegarde.

    La restauration d’une sauvegarde complète ne nécessite qu’une seule image de sauvegarde.

  • Différentiel (VSS_BT_DIFFERENTIAL). L’API VSS est utilisée pour garantir que seuls les fichiers qui ont été modifiés ou ajoutés depuis la dernière sauvegarde complète doivent être copiés sur un support de stockage ; toutes les informations de sauvegarde intermédiaire sont ignorées. Cela peut inclure des fichiers entiers ou des plages spécifiques dans des fichiers. Une sauvegarde différentielle est associée à une sauvegarde complète et ne peut généralement pas être restaurée tant que la sauvegarde complète n’a pas été restaurée. S’il existe des fichiers journaux, ils ne seront généralement pas tronqués à la suite de cette sauvegarde.

    La restauration d’une sauvegarde différentielle nécessite l’image de sauvegarde d’origine et l’image de sauvegarde différentielle la plus récente effectuée depuis la dernière sauvegarde complète.

  • Incrémentiel (VSS_BT_INCREMENTAL). L’API VSS est utilisée pour garantir que seuls les fichiers qui ont été modifiés ou ajoutés depuis la dernière sauvegarde complète ou incrémentielle doivent être copiés sur un support de stockage. Cela peut inclure des fichiers entiers ou des plages spécifiques dans des fichiers. Certains enregistreurs n’autorisent pas le mélange des sauvegardes incrémentielles avec des sauvegardes différentielles. S’il existe des fichiers journaux, ils peuvent être tronqués à la suite de cette sauvegarde.

    La restauration d’une sauvegarde incrémentielle nécessite l’image de sauvegarde d’origine et toutes les images de sauvegarde incrémentielle effectuées depuis la sauvegarde initiale.

  • Sauvegarde du journal (VSS_BT_LOG). Seuls les fichiers journaux d’un enregistreur (fichiers ajoutés à un composant avec la méthode IVssCreateWriterMetadata::AddDataBaseLogFiles et récupérés par un appel à IVssWMComponent::GetDatabaseLogFile) seront sauvegardés. Ce type de sauvegarde est spécifique à VSS. Les sauvegardes de journaux ont tendance à être effectuées assez fréquemment. En règle générale, le fichier journal est tronqué à la suite de cette sauvegarde.

  • Copie de sauvegarde (VSS_BT_COPY). Comme le type de sauvegarde VSS_BT_FULL, les fichiers sont sauvegardés quelle que soit leur date de dernière sauvegarde. Toutefois, l’historique de sauvegarde de chaque fichier ne sera pas mis à jour et ce type de sauvegarde ne peut pas être utilisé comme base d’une sauvegarde incrémentielle ou différentielle. Les fichiers journaux ne doivent jamais être tronqués à la suite d’une sauvegarde de copie.

Prise en charge partielle des fichiers

Certains enregistreurs prennent en charge la restauration de fichiers via le remplacement de parties des fichiers qu’ils gèrent. Un demandeur peut être conçu pour tirer parti de cela et, si c’est le cas, il l’indique en définissant les informations dans IVssBackupComponents::SetBackupState.

Les enregistreurs indiquent le type de sauvegardes pris en charge en appelant IVssCreateWriterMetadata::SetBackupSchema lors du traitement de l’événement Identifier . Le paramètre dsSchemaMask de la méthode IVssCreateWriterMetadata::SetBackupSchema est un masque de bits indiquant les types de sauvegarde pris en charge. Tous les enregistreurs doivent prendre en charge les sauvegardes complètes.

VSS_BS_DIFFERENTIAL

Indique la prise en charge des sauvegardes différentielles.

VSS_BS_INCREMENTAL

Indique la prise en charge des sauvegardes incrémentielles.

VSS_BS_LOG

Indique la prise en charge des sauvegardes de journaux.

VSS_BS_COPY

Indique la prise en charge des sauvegardes de copie.

VSS_BS_EXCLUSIVE_INCREMENTAL_DIFFERENTIAL

Indique qu’un enregistreur ne prend pas en charge la combinaison de sauvegardes incrémentielles avec des sauvegardes différentielles.

L’enregistreur peut déterminer le type de sauvegarde en cours d’exécution en appelant CVssWriter::GetBackupType. Le premier moment où cela peut être effectué est lors du traitement de l’événement PrepareForBackup. CVssWriter::GetBackupType retourne un membre de l’énumération VSS_BACKUP_TYPE . Si le type de sauvegarde n’est pas pris en charge par l’enregistreur, celui-ci doit traiter la sauvegarde comme une sauvegarde complète.

Tampons de sauvegarde

Les sauvegardes incrémentielles et différentielles sont toujours liées à une sauvegarde précédente. Il existe deux façons de lier les sauvegardes. Pour les magasins de données simples, le demandeur peut effectuer le suivi de la corrélation entre les sauvegardes. Toutefois, pour les magasins de données plus complexes, l’enregistreur doit conserver son propre horodatage avec la sauvegarde ; ce timestamp peut suivre la position du journal, les informations de point de contrôle, etc. Un enregistreur indique qu’il a besoin de ses propres horodatages en définissant le VSS_BS_TIMESTAMPED bit lorsqu’il appelle IVssCreateWriterMetadata::SetBackupSchema.

Un enregistreur peut stocker un horodatage avec chaque composant sauvegardé. L’enregistreur stocke l’horodatage en appelant IVssComponent::SetBackupStamp et en transmettant une représentation sous forme de chaîne du tampon pour le paramètre wszBackupStamp . En règle générale, un rédacteur appelle cette méthode lors du traitement de l’événement PostSnapshot . Toutefois, pour les sauvegardes qui n’impliquent pas de cliché instantané, l’événement PostSnapshot n’est pas envoyé. Dans ce cas, IVssComponent::SetBackupStamp doit être appelé lors du traitement de l’événement PrepareForBackup .

Lorsqu’une sauvegarde incrémentielle ou différentielle est effectuée, le demandeur indique au rédacteur l’empreinte de sauvegarde de la sauvegarde précédente qui sert de base pour cette sauvegarde. L’enregistreur peut accéder à ce tampon de sauvegarde précédent lors du traitement de l’événement PrepareForBackup ou PostSnapshot, en appelant IVssComponent::GetPreviousBackupStamp. L’enregistreur peut utiliser le tampon retourné pour déterminer ce qui doit être sauvegardé.

Stratégies de sauvegarde

Stratégies de fichiers de sauvegarde de fichiers

Souvent, certains fichiers signalés dans les métadonnées de l’enregistreur doivent uniquement être sauvegardés lors de l’exécution de certains types de sauvegarde. Certains fichiers peuvent être requis uniquement lors de l’exécution d’une sauvegarde complète. D’autres fichiers peuvent être nécessaires uniquement lors de l’exécution d’une sauvegarde incrémentielle ou différentielle. VSS fournit une méthode permettant aux rédacteurs d’indiquer ces informations au demandeur. Lors de l’ajout de fichiers à des composants à l’aide d’IVssCreateWriterMetadata::AddDatabaseFiles, IVssCreateWriterMetadata::AddDatabaseLogFiles ou IVssCreateWriterMetadata::AddFilesToFileGroup, le paramètre dwBackupTypeMask indique pour quels types de sauvegarde ces fichiers doivent être sauvegardés. Le masque peut contenir une ou plusieurs des valeurs suivantes :

VSS_FSBT_FULL_BACKUP_REQUIRED

Obligatoire pour les sauvegardes complètes.

VSS_FSBT_DIFFERENTIAL_BACKUP_REQUIRED

Obligatoire pour les sauvegardes différentielles.

VSS_FSBT_INCREMENTAL_BACKUP_REQUIRED

Obligatoire pour les sauvegardes incrémentielles.

VSS_FSBT_LOG_BACKUP_REQUIRED

Obligatoire pour les sauvegardes de journaux.

VSS_FSBT_ALL_BACKUP_REQUIRED

Obligatoire pour tous les types de sauvegarde ; il s’agit de la valeur par défaut.

Cette spécification remplace la spécification de sélectivité du composant. Par exemple, considérez un composant dont les fichiers sont tous marqués avec VSS_FSBT_LOG_BACKUP_REQUIRED mais pas avec VSS_FSBT_FULL_BACKUP_REQUIRED. Supposons que ce composant n’est pas sélectionnable pour la sauvegarde (bSelectable était false lorsque IVssCreateWriterMetadata::AddComponent a été appelé). Dans le cas d’une sauvegarde de journal, cela signifie que tous les fichiers de ce composant doivent toujours être sauvegardés. Toutefois, dans le cas d’une sauvegarde complète, aucun des fichiers n’a besoin d’être sauvegardé, même si la sélectivité du composant implique qu’il doit être sauvegardé.

Sauvegarde par heure de la dernière modification

Un moyen pour un enregistreur d’indiquer quels fichiers ont changé est d’utiliser le mécanisme de fichier différent. Un enregistreur peut spécifier que certains fichiers d’un composant ne doivent être sauvegardés que s’ils ont été modifiés depuis un certain temps. L’enregistreur appelle IVssComponent::AddDifferencedFilesByLastModifyTime avec une spécification de fichier et une heure de dernière modification. IVssComponent::AddDifferencedFilesByLastModifyTime est généralement appelé lors du traitement de l’événement PostSnapshot, bien qu’il puisse être appelé lors du traitement de l’événement PrepareForBackup. Le demandeur doit ensuite sauvegarder tous les fichiers correspondant à la spécification de fichier qui ont changé depuis l’heure spécifiée. Si l’enregistreur utilise le mécanisme d’empreinte de sauvegarde, cette heure de dernière modification est déterminée en fonction de l’empreinte de sauvegarde précédente dans le document de sauvegarde. L’enregistreur peut également passer zéro pour l’heure de la dernière modification, ce qui indique que le demandeur est responsable de la détermination de l’heure de la dernière sauvegarde et que les fichiers ont été modifiés depuis cette date.

Sauvegarde de fichiers partielle

Un autre moyen pour un enregistreur d’indiquer les modifications apportées au demandeur consiste à utiliser le mécanisme de fichier partiel. Un enregistreur peut spécifier des plages d’octets dans les fichiers de composants qui doivent être sauvegardés ; l’enregistreur peut spécifier ces plages de fichiers lors du traitement de l’événement PostSnapshot ou PrepareForBackup. L’enregistreur appelle IVssComponent::AddPartialFile pour ajouter des spécifications de fichier partielles à la sauvegarde. Une spécification de fichier partielle se compose d’un chemin d’accès et d’un nom de fichier, ainsi que d’informations sur les plages du fichier qui doivent être sauvegardées.

Règles de spécification de fichier

IVssComponent::AddDifferencedFilesByLastModifyTime ou IVssComponent::AddPartialFile peuvent tous deux être utilisés pour modifier les spécifications de fichier fournies pendant l’événement Identifier ou pour ajouter des fichiers entièrement nouveaux à la spécification. Si l’enregistreur modifie le jeu d’informations pendant l’événement Identifier à l’aide de IVssComponent::AddDifferencedFilesByLastModifyTime, la spécification du fichier doit correspondre exactement à l’une des spécifications de fichier dans le composant actuel. La spécification de fichier ne doit pas chevaucher partiellement les fichiers du composant actuel et ne doit pas correspondre aux fichiers d’autres composants. Les fichiers spécifiés à l’aide d’IVssComponent::AddPartialFile peuvent toutefois chevaucher partiellement une autre spécification de fichier. Les informations définies par IVssComponent::AddDifferencedFilesByLastModifyTime ou IVssComponent::AddPartialFile remplacent le jeu d’informations précédemment à l’aide de l’interface IVssCreateWriterMetadata en réponse à l’événement Identifier.

Les spécifications de fichier générales peuvent avoir une valeur d’emplacement alternatif (définie par le paramètre wszAlternateLocation de IVssCreateWriterMetadata::AddFilesToFileGroup) qui indique un autre emplacement à partir duquel obtenir le fichier au moment de la sauvegarde. Si la spécification de fichier définie via les mécanismes de fichier différent ou partiel correspond à une spécification de fichier existante qui a un autre emplacement, l’application de sauvegarde obtient les données à partir de cet autre emplacement.

Si la spécification de fichier définie dans IVssComponent::AddDifferencedFilesByLastModifyTime ou dans IVssComponent::AddPartialFile ne correspond pas aux fichiers et du composant qui sont sauvegardés, tous les fichiers correspondants sont maintenant ajoutés à la sauvegarde. Veillez à ce que l’enregistreur ajoute uniquement les fichiers qui existent sur un volume qui est déjà en cours de copie fantôme lors de cette opération ; sinon, le demandeur risque de ne pas pouvoir sauvegarder ces fichiers. Si ces fonctions sont appelées lors du traitement de l’événement PostSnapshot, cela peut être déterminé à l’aide de la méthode CVssWriter::IsPathAffected . Si elle est appelée lors de la gestion de l’événement PrepareForBackup, l’enregistreur doit effectuer cette détermination à l’aide d’une autre méthode.

Sauvegarde sans cliché instantané

Certains types de fichiers peuvent ne pas avoir besoin d’être sauvegardés à partir d’un volume de cliché instantané. Par exemple, cela est souvent vrai pour les fichiers journaux de base de données. Étant donné que les fichiers journaux augmentent de façon monotone et qu’un writer peut spécifier exactement les parties du fichier à sauvegarder à l’aide de fichiers partiels, il est souvent possible de sauvegarder le journal hors du volume d’origine. En guise d’optimisation, un writer peut marquer les fichiers nécessitant des clichés instantanés pour différents types de sauvegarde à l’aide des indicateurs définis dans le paramètre dwBackupTypeMask de IVssCreateWriterMetadata::AddDatabaseFiles, IVssCreateWriterMetadata::AddDatabaseLogFiles ou IVssCreateWriterMetadata::AddFilesToFileGroup. Les indicateurs pris en charge sont les suivants :

VSS_FSBT_FULL_SNAPSHOT_REQUIRED

Cliché instantané requis pour les sauvegardes complètes.

VSS_FSBT_DIFFERENTIAL_SNAPSHOT_REQUIRED

Cliché instantané requis pour les sauvegardes différentielles.

VSS_FSBT_INCREMENTAL_SNAPSHOT_REQUIRED

Cliché instantané requis pour les sauvegardes incrémentielles.

VSS_FSBT_LOG_SNAPSHOT_REQUIRED

Cliché instantané requis pour les sauvegardes de journaux.

VSS_FSBT_ALL_SNAPSHOT_REQUIRED

Cliché instantané requis pour tous les types de sauvegarde ; il s’agit de la valeur par défaut.

Si un volume spécifique contient uniquement des composants qui ne nécessitent pas de cliché instantané pour cette sauvegarde, le demandeur peut ignorer l’étape de création d’un cliché instantané pour ce volume. Toutes les données de ce volume peuvent être copiées sur le support de sauvegarde directement à partir du volume d’origine.

Nettoyage de sauvegarde

Si l’enregistreur doit effectuer la troncation du journal ou un autre nettoyage post-sauvegarde, l’endroit approprié pour le faire est lors du traitement de l’événement BackupComplete . L’événement BackupShutdown sera envoyé un peu après BackupComplete, de sorte qu’un nettoyage peut également être effectué dans le gestionnaire d’événements BackupShutdown.

L’événement BackupShutdown est toujours envoyé après l’arrêt d’une sauvegarde. Si le demandeur s’arrête anormalement lors de l’exécution d’une sauvegarde, BackupShutdown est envoyé immédiatement, sans avoir d’abord envoyé BackupComplete. Si l’enregistreur doit propre un état quelconque, cela peut être effectué ici. Toutefois, la troncation du journal ne doit pas se produire dans ce cas, car la sauvegarde n’a pas nécessairement été terminée.

Stratégies de restauration

Les tâches de base des rédacteurs lors de la restauration sont de vérifier que la restauration peut se produire lors de la gestion de l’événement PreRestore et que la restauration s’est produite lors de la gestion de l’événement PostRestore. Les magasins plus complexes effectuent également un processus de récupération dans le gestionnaire PostRestore. Si la restauration fait partie d’une restauration incrémentielle ou différentielle, l’enregistreur souhaite généralement retarder ce processus de récupération jusqu’à ce que toutes les restaurations incrémentielles ou différentielles soient terminées. IVssComponent::GetAdditionalRestores indique s’il s’agit de la restauration finale de ce composant ou s’il y a d’autres restaurations à venir. Si IVssComponent::GetAdditionalRestores retourne true, l’enregistreur ne doit pas effectuer sa procédure de récupération sur ce composant.

Nouvelles cibles

S’il est pris en charge par l’enregistreur, le demandeur peut restaurer les fichiers de données à un emplacement autre que l’emplacement de sauvegarde d’origine. Un writer indique la prise en charge de ce mode de restauration en définissant le bit VSS_BS_WRITER_SUPPORTS_NEW_TARGET dans le paramètre dsSchemaMask lors de l’appel de IVssCreateWriterMetadata::SetBackupSchema. Un enregistreur obtient les nouveaux emplacements des fichiers de composants au moment de la restauration en appelant IVssComponent::GetNewTargetCount et IVssComponent::GetNewTarget.

Cibles dirigées

Pour les scénarios de restauration complexes, un writer peut souhaiter mapper des plages d’un fichier sauvegardé sur différentes plages du même fichier ou d’un autre fichier. Pour ce faire, utilisez le mécanisme de cible dirigée. Pour ce faire, un writer doit d’abord indiquer que cela se produit en appelant IVssComponent::SetRestoreTarget, en passant VSS_RT_DIRECTED pour le paramètre cible . Ensuite, pour chaque mappage, l’enregistreur appelle IVssComponent::AddDirectedTarget. Cette méthode prend un chemin d’accès complet à un fichier source sur la sauvegarde et un chemin d’accès complet à un fichier de destination dans lequel sera restauré. Il prend également une liste de plages pour chacun de ces fichiers. L’enregistreur appelle ces fonctions lors de la gestion de l’événement PreRestore, et le demandeur est ensuite chargé de restaurer les plages spécifiées dans le fichier source dans les plages mappées dans le fichier de destination. Le format de la chaîne de plages est le même que dans IVssComponent::AddPartialFile

Métadonnées de l’enregistreur privé

Il est souvent utile pour un writer de gérer des métadonnées privées avec une sauvegarde afin d’effectuer correctement une restauration incrémentielle ou différentielle. Un writer peut appeler IVssComponent::SetBackupMetadata tout en gérant PrepareForBackup ou PostSnapshot pour stocker les métadonnées. Ces métadonnées sont accessibles par l’enregistreur pendant PreRestore ou PostRestore en appelant IVssComponent::GetBackupMetadata. Les métadonnées peuvent également être stockées avec une spécification de fichier partielle à l’aide du paramètre wszMetadata de IVssComponent::AddPartialFile ; ces métadonnées sont accessibles via le paramètre pbstrMetadatade IVssComponent::GetPartialFile. L’enregistreur peut également se transmettre des métadonnées entre CVssWriter::OnPreRestore et CVssWriter::OnPostRestore. Dans CVssWriter::OnPreRestore, les métadonnées sont définies en appelant IVssComponent::SetRestoreMetadata. Dans CVssWriter::OnPostRestore, les métadonnées sont récupérées en appelant IVssComponent::GetRestoreMetadata.