Rôle demandeur 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.

Type 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 n’est 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.

Le demandeur spécifie le type de sauvegarde en cours d’exécution via le paramètre backupType de IVssBackupComponents::SetBackupState. Différents enregistreurs prendront en charge différents types de sauvegarde. Une fois que IVssBackupComponents::GatherWriterMetadata a été appelé, le demandeur peut déterminer les types de sauvegarde pris en charge par un enregistreur donné en appelant IVssExamineWriterMetadata::GetBackupSchema. La valeur retournée est un masque de bits indiquant la prise en charge de différents types de sauvegarde. VSS_BS_DIFFERENTIAL indique la prise en charge des sauvegardes différentielles, VSS_BS_INCREMENTAL pour les sauvegardes incrémentielles, VSS_BS_LOG pour les sauvegardes de journaux et VSS_BS_COPY pour les sauvegardes de copie ; tous les enregistreurs doivent prendre en charge les sauvegardes complètes. Si un enregistreur ne prend pas en charge la combinaison de sauvegardes incrémentielles avec des sauvegardes différentielles, l’indicateur VSS_BS_EXCLUSIVE_INCREMENTAL_DIFFERENTIAL est également ajouté. Si le demandeur effectue une sauvegarde incrémentielle ou différentielle et qu’un enregistreur donné ne prend pas en charge ce type de sauvegarde, une sauvegarde complète doit être effectuée sur cet enregistreur.

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. Le demandeur peut déterminer si un enregistreur donné doit stocker son propre horodatage en vérifiant le bit VSS_BS_TIMESTAMPED dans la valeur retournée par IVssExamineWriterMetadata::GetBackupSchema.

Les rédacteurs qui stockent un horodatage dans une sauvegarde ajoutent l’horodatage lors du traitement d’IVssBackupComponents::P repareForBackup ou lors du traitement d’IVssBackupComponents::D oSnapshotSet. Le demandeur peut obtenir ce timestamp en appelant IVssComponent::GetBackupStamp. Lors de l’exécution d’une sauvegarde incrémentielle ou différentielle, le demandeur doit lier la sauvegarde actuelle à une sauvegarde précédente. Pour ce faire, obtenez l’horodatage à partir de la sauvegarde précédente d’un composant spécifique et passez-le à la fonction IVssBackupComponents::SetPreviousBackupStamp ; Cela doit être effectué pour chaque composant qui a été sauvegardé dans la sauvegarde précédente.

Sauvegarde de fichiers

Sauvegarde des fichiers signalés par Writer

Chaque spécification de fichier qu’un enregistreur ajoute à ses métadonnées pendant la phase GatherWriterMetadata contient un masque de type de sauvegarde qui spécifie quand le fichier doit être sauvegardé. Le demandeur détermine ce qu’est ce masque en appelant IVssWMFiledesc::GetBackupTypeMask. Les valeurs de ce masque sont utilisées pour déterminer pour quels types de sauvegarde la spécification de fichier doit être sauvegardée. Le masque peut contenir une ou plusieurs des valeurs de bits 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

Les informations de spécification de fichier spécifiées dans la phase IVssBackupComponents::GatherWriterMetadata ne fournissent pas d’informations au demandeur sur ce qui a changé depuis la dernière sauvegarde. Un moyen pour un enregistreur d’indiquer les modifications apportées au demandeur consiste à 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 peut spécifier ces fichiers dans IVssBackupComponents::P repareForBackup ou dans IVssBackupComponents::D oSnapshotSet. Un demandeur peut déterminer ces fichiers en appelant IVssComponent::GetDifferencedFilesCount et IVssComponent::GetDifferencedFile. Si la spécification de fichier correspond à un ensemble dans IVssBackupComponents::GatherWriterMetadata (qui est actuellement valide en fonction du masque de type de sauvegarde), les informations de fichier différentes remplacent les informations précédentes ; autrement dit, les fichiers correspondant à cette spécification de fichier sont désormais sauvegardés uniquement s’ils ont été modifiés depuis l’heure spécifiée. L’heure de la dernière modification est communiquée à l’aide d’une structure FILETIME . Si la valeur de cette structure est zéro, cela implique que l’heure de la dernière modification doit être déterminée en fonction de l’enregistrement du demandeur de l’heure de la dernière sauvegarde.

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 dans IVssBackupComponents::P repareForBackup ou dans IVssBackupComponents::D oSnapshotSet. Un demandeur peut déterminer ces fichiers en appelant IVssComponent::GetPartialFileCount et IVssComponent::GetPartialFile. IVssComponent::GetPartialFile retourne un chemin d’accès et un nom de fichier pointant vers le fichier, ainsi qu’une chaîne de plages indiquant ce qui doit être sauvegardé dans le fichier. Comme pour les fichiers différentiels, si le chemin d’accès et le nom de fichier correspondent à une spécification de fichier définie par l’enregistreur dans IVssBackupComponents::GatherWriterMetadata, les informations de fichier partiel remplacent le paramètre précédent. La chaîne de plages peut avoir deux formats : elle peut soit spécifier les plages directement, soit spécifier un fichier contenant des informations sur les plages. Si vous spécifiez directement des plages, la syntaxe est une liste séparée par des virgules du format offset1:length1, offset2:length2, où chaque décalage et longueur est un entier non signé 64 bits. Si vous spécifiez un fichier de plages, la chaîne de plages doit être définie sur File= filename, où filename est le chemin d’accès complet au fichier de plages. Le fichier de plages lui-même est un fichier binaire qui est mis en forme sous la forme d’une liste d’entiers non signés 64 bits. Le premier entier indique le nombre de plages représentées dans le fichier. Chaque paire d’entiers suivante représente le décalage et la longueur d’une plage. Le demandeur doit également veiller à sauvegarder et restaurer ce fichier de plages.

Règles de spécification de fichier

Les spécifications de fichier ajoutées par le biais du fichier différent et des mécanismes de fichier partiel modifient les spécifications de fichier définies dans IVssBackupComponents::GatherWriterMetadata ou ajoutent de nouveaux fichiers. Si vous modifiez des spécifications de fichiers définies dans IVssBackupComponents::GatherWriterMetadata à l’aide du mécanisme de fichier partiel, un demandeur peut s’attendre à ce que la spécification du fichier corresponde exactement à l’une des spécifications de fichier définies dans le composant dans IVssBackupComponents::GatherWriterMetadata. La spécification de fichier ne chevauchera pas partiellement une autre spécification de fichier et ne correspondra à aucune spécification de fichier dans les autres composants de cet enregistreur. Les spécifications de fichier ajoutées à l’aide du mécanisme de fichier partiel peuvent toutefois chevaucher partiellement une autre spécification de fichier. Lorsque cela est vrai, la spécification de fichier différent ou de fichier partiel remplace le jeu de spécifications dans IVssBackupComponents::GatherWriterMetadata. Les spécifications de fichier générales peuvent avoir une valeur d’autre emplacement (retournée par IVssWMFiledesc::GetAlternateLocation) qui indique un autre emplacement à partir duquel obtenir le fichier au moment de la sauvegarde. Si les spécifications de fichier définies via les mécanismes de fichier différent ou partiel correspondent à une spécification de fichiers existante qui a un autre emplacement, les données doivent être récupérées à partir de cet autre emplacement. Si les spécifications de fichier définies par le biais des mécanismes de fichier différent ou de fichier partiel ne correspondent à aucune spécification existante pour le composant, ces plages de fichiers doivent maintenant être ajoutées à la sauvegarde. Le demandeur peut s’attendre à ce que seuls les fichiers sur les volumes qui ont déjà été inclus dans le jeu de clichés instantanés soient ajoutés à l’aide de l’un de ces mécanismes.

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 se développent de manière monotone et qu’un enregistreur 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 enregistreur peut marquer les fichiers qui nécessitent des clichés instantanés pour différents types de sauvegarde à l’aide du masque de type de sauvegarde. La valeur retournée par IVssWMFiledesc::GetBackupTypeMask peut contenir une ou plusieurs des valeurs de bits suivantes :

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.

Restauration de fichiers

Restaurations séquentielles

Une fois que le demandeur a terminé d’effectuer une opération de restauration, il envoie l’événement PostRestore à tous les enregistreurs. En règle générale, les rédacteurs gèrent cet événement en effectuant une récupération ou d’autres opérations post-restauration. Toutefois, la restauration des sauvegardes incrémentielles se produit généralement sous la forme d’une séquence d’opérations de restauration, une par sauvegarde incrémentielle. Le demandeur doit informer l’auteur qu’une telle restauration est en cours afin d’empêcher la récupération ou d’autres opérations indésirables de se produire tant que la restauration n’est pas complètement terminée. Pour ce faire, appelez IVssBackupComponents::SetAdditionalRestores. Cette méthode est appelée par composant et indique à l’enregistreur que d’autres restaurations sont à venir pour ce composant. Pour la restauration finale dans la séquence, l’indicateur additional-restores doit avoir la valeur false (sa valeur par défaut), ce qui indique qu’il s’agit de la dernière restauration dans la séquence pour 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. Le demandeur peut case activée pour cette prise en charge en appelant IVssExamineWriterMetadata::GetBackupSchema. Le bit VSS_BS_WRITER_SUPPORTS_NEW_TARGET est défini si l’enregistreur prend en charge ce comportement. Le demandeur informe l’enregistreur du nouvel emplacement en appelant IVssBackupComponents::AddNewTarget pour chaque spécification de fichier déplacé. Le demandeur peut également décider de restaurer un fichier de plages spécifique à un autre emplacement. Le demandeur informe l’enregistreur de cette modification en appelant IVssBackupComponents::SetRangesFilePath.

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 cible dirigé. Le demandeur peut déterminer après la phase IVssBackupComponents::P reRestore que ce mécanisme est utilisé pour un composant en appelant IVssComponent::GetRestoreTarget et en recherchant un retour de VSS_RT_DIRECTED. Le demandeur peut obtenir toutes ces restaurations redirigées en appelant IVssComponent::GetDirectedTargetCount et IVssComponent::GetDirectedTarget. IVssComponent::GetDirectedTarget retourne 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é. Elle retourne également une liste de plages pour chacun de ces fichiers. 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::GetPartialFile.