Administration par programmation de captures instantanées de base de données

Dernière modification : mardi 16 février 2010

S’applique à : SharePoint Foundation 2010

Cette rubrique explique comment vous pouvez incorporer des captures instantanées de base de données dans vos solutions personnalisées de sauvegarde et de récupération de données.

Gestion des captures instantanées de base de données

Si la batterie de serveurs Microsoft SharePoint Foundation utilise les éditions Enterprise ou Developer de Microsoft SQL Server, les administrateurs de batterie peuvent bénéficier de la fonctionnalité de capture instantanée. Les captures instantanées peuvent être gérées dans SQL Server, mais l’API de SharePoint Foundation fournit aussi un ensemble de classes qui peuvent être utilisées en combinaison avec des travaux du minuteur (SPTimerService et SPJobDefinition) pour gérer les captures instantanées. Votre solution peut déterminer par programme la fréquence à laquelle les captures instantanées sont créées, la durée de vie de chacune d’elle avant qu’elle soit supprimée automatiquement, et le nombre de captures instantanées conservées à un moment donné.

Notes

Une capture instantanée SQL Server n’est pas une copie réelle de toute une base de données. À sa création initiale, une capture instantanée est vide. Chaque fois que des données sont écrites dans la base de données d’origine, la valeur précédente est copiée dans la capture instantanée. Lorsqu’il accède à une capture instantanée, SQL Server traite la capture instantanée et les données non modifiées de la base de données d’origine comme s’il s’agissait d’une même base de données. Ainsi, la capture instantanée, en combinaison avec les données non modifiées de la base de données d’origine, est en fait un enregistrement de la base de données telle qu’elle était au moment où la capture instantanée a été créée. Pour plus d’informations, voir Database Snapshots.

Rendre vos bases de données personnalisées restaurables depuis une capture instantanée

Si la solution SharePoint Foundation de votre entreprise inclut une autre base de données qui est hébergée par les éditions Enterprise ou Developer de SQL Server, vous pouvez inscrire la base de données dans l’infrastructure SharePoint Foundation en concevant la classe qui la représente avec une implémentation de l’interface IDatabaseSnapshotRestore. Pour des détails sur la façon d’y procéder, voir Procédure : créer une classe de base de données qui peut être restaurée à partir d’un instantané.

API de gestion des captures instantanées

Il existe deux classes très importantes dans le modèle objet SharePoint Foundation utilisé pour la gestion des captures instantanées. Elles sont présentées dans les deux sous-sections suivantes.

SPDatabaseSnapshot

Les objets de ce type représentent des captures instantanées. Ils existent seulement en tant que membres d’une collection SPDatabaseSnapshotCollection qui existe elle-même seulement en tant que valeur de la propriété SPDatabase.Snapshots. Les membres importants de la classe SPDatabaseSnapshot sont présentés ici de façon sommaire. Pour plus d’informations, consultez les rubriques de référence pour chacun d’eux (et pour les autres membres de la classe).

  • Delete() - Comme son nom l’indique, cette méthode supprime la capture instantanée. Elle peut être appelée sur une base ad hoc, mais elle est généralement appelée par un travail du minuteur qui vérifiera à certains intervalles si la capture instantanée a atteint sa durée de vie maximale autorisée (MaximumRetention), ou si le nombre maximal autorisé de captures instantanées (SnapshotLimit) a été dépassé et si la capture instantanée est la capture la plus ancienne pour la base de données.

  • Restore() - Cette méthode remplace la base de données par la capture instantanée, puis supprime toutes les captures instantanées existantes pour la base de données. Une surcharge de la méthode permet au code appelant de choisir de forcer un remplacement même si la base de données n’implémente pas IDatabaseSnapshotRestore.

SPDatabaseSnapshotCollection

Les membres très importants de la classe SPDatabaseSnapshotCollection sont présentés ici de façon sommaire. Pour plus d’informations, consultez les rubriques de référence pour chacun d’eux (et pour les autres membres de la classe).

  • CreateSnapshot() - Cette méthode provoque la création d’une capture instantanée par SQL Server. Lors de chaque opération d’écriture ultérieure dans la base de données, le serveur de base de données écrit la valeur d’origine dans la capture instantanée. La méthode définit également EnabledManagement à true.

  • DeleteSnapshots() - Cette méthode supprime toutes les captures instantanées existantes pour la base de données.

  • RefreshSnapshots() - Cette méthode synchronise la base de données de contenu SharePoint Foundation et la base de données de configuration en tenant compte des captures instantanées de façon à garantir que toutes les captures instantanées, et seulement celles-ci, existant pour la base de données de contenu dans SQL Server sont inscrites dans la base de données de configuration. La règle générale est que vous devez appeler cette méthode juste avant que votre code accède à une capture instantanée pour une raison quelconque, par exemple avec un indexeur, « sfdb.Snapshots[0] », où sfdb est un objet SPDatabase. Cependant, les méthodes CreateSnapshot() et DeleteSnapshots() appellent chacune elles-mêmes RefreshSnapshots().

  • EnabledManagement - Cette propriété, lorsque sa valeur est true, indique que les travaux du service de minuteur intégré de SharePoint Foundation qui gèrent les captures instantanées doivent inclure la base de données parent dans leur gestion ; par exemple, le travail va généralement créer et supprimer des captures instantanées pour la base de données à des intervalles spécifiés. Lorsque la valeur de la propriété est false, ces travaux ignorent la base de données. Si votre solution SharePoint Foundation inclut vos propres travaux du minuteur de gestion des captures instantanées pour certaines bases de données, vous devez définir EnabledManagement à false pour ces bases de données, sinon deux ensembles de travaux du minuteur créeront et supprimeront des captures instantanées pour la même base de données, en conflit l’un avec l’autre. La méthode CreateSnapshot() définit cette propriété à true.

  • CreationInterval - Cette propriété spécifie la fréquence (en heures) avec laquelle une nouvelle capture instantanée de la base de données parent est créée.

  • MaximumRetention - Cette propriété spécifie la durée de vie (en heures) d’une nouvelle capture instantanée avant qu’elle soit supprimée.

  • SnapshotLimit - Cette propriété spécifie le nombre maximal de captures instantanées pour la base de données parent pouvant exister à un moment donné.

Configurer les captures instantanées d’une base de données pour la gestion

Pour configurer une base de données de façon à ce qu’elle soit gérée par le travail du minuteur de captures instantanées intégré qui est livré avec SharePoint Foundation, exécutez du code qui effectue les opérations suivantes.

Pour configurer une base de données de façon à ce qu’elle soit gérée par un travail du minuteur de captures instantanées personnalisé, vous procédez de la même façon, sauf que vous définissez la propriété EnabledManagement à false.

Restauration à partir d’une capture instantanée

Les étapes principales pour restaurer par programmation une base de données depuis une capture instantanée sont les suivantes :

  1. Obtenez une référence à l’objet SPDatabase qui représente la base de données.

  2. Appelez RefreshSnapshots() pour vous assurer que vous travaillez avec le jeu de captures instantanées actuel pour la base de données. Par exemple, « sfdb.Snapshots.RefreshSnapshots(); », où sfdb est une référence à l’objet SPDatabase.

  3. Obtenez une référence à la capture instantanée que vous voulez utiliser pour la restauration. Par exemple, pour obtenir une référence à la capture instantanée la plus récente, vous pouvez utiliser les lignes de code suivantes :

    Int32 numberOfSnapshots = sfdb.Snapshots.Count;
    SPDatabaseSnapshot spDBSnapshot = sfdb.Snapshots[numberOfSnapshots-1];
    
    Dim numberOfSnapshots As Int32 = sfdb.Snapshots.Count
    Dim spDBSnapshot As SPDatabaseSnapshot = sfdb.Snapshots(numberOfSnapshots-1)
    
  4. Appelez une des méthodes Restore() pour la capture instantanée. Voici un exemple.

    spDBSnapshot.Restore();
    
    spDBSnapshot.Restore()
    

Implémentation de votre propre travail du minuteur de gestion des captures instantanées

Si vous voulez développer une application de gestion personnalisée des captures instantanées avec le modèle objet SharePoint Foundation, vous pouvez dériver votre propre classe de la classe SPJobDefinition. La tâche principale consiste à remplacer la méthode Execute(Guid). En général, vous voulez que cette méthode effectue les opérations suivantes :

  • Obtenir une référence à l’objet SPDatabaseServiceInstance qui héberge les bases de données.

  • Boucler à travers tous les membres de la propriété Databases de l’objet et effectuer ce qui suit :

    • Vérifier la valeur de sfdb.Snapshots.EnabledManagement, où sfdb est une référence à l’objet SPDatabase, et ne rien faire si la valeur est true. (Si la valeur est true, les travaux du minuteur de gestion des captures instantanées intégré de SharePoint Foundation vont gérer les captures instantanées pour la base de données.)

    • Pour chacune des autres bases de données, actualiser leur liste des captures instantanées avec un appel à RefreshSnapshots(), puis supprimer les captures pour lesquelles la valeur de Age est supérieure à la valeur de la propriété MaximumRetention.

    • Effectuer un autre appel de RefreshSnapshots() puis comparer l’âge de la capture instantanée la plus récente (sfdb.Snapshots[sfdb.Snapshots.Count-1].Age) avec la valeur de CreationInterval. Si cet âge est supérieur ou égal à cette valeur, créer une nouvelle capture instantanée avec un appel à CreateSnapshot().

    • Effectuer un autre appel de RefreshSnapshots(), puis vérifier si le nombre total de captures instantanées est supérieur à SnapshotLimit. Si c’est le cas, supprimer suffisamment de captures instantanées pour ramener le total en dessous de cette limite. Supprimer d’abord la capture instantanée la plus ancienne (sfdb.Snapshots[0]), puis la deuxième en ancienneté (sfdb.Snapshots[1]), etc.