Comment restaurer une table à partir d’une sauvegarde de base de données SQL Server

Si vous demandiez à un administrateur de base de données (DBA) quelle est la fonctionnalité qu’il aimerait le plus voir apparaître dans la fonctionnalité de récupération de SQL Server, il répondrait sans aucun doute: “La possibilité de restaurer une seule table depuis une sauvegarde de la base de données”.

Il est bien sûr possible de récupérer les données d’une table donnée à partir de la sauvegarde de la base de données dans laquelle elle se trouve, mais vous ne pouvez réaliser cette opération sans restaurer l’entière de la sauvegarde.

Les administrateurs de base de données veulent cela pour plusieurs raisons:

  1. Le plus souvent le reste de la base de données est intact. Seule la table qui a été endommagée ou supprimée de manière accidentelle doit être récupérée
  2. La restauration d’une sauvegarde entière peut prendre beaucoup de temps. Généralement lorsque la table est endommagée à tel point qu’une restauration est nécessaire, l’administrateur doit trouver une solution très rapidement

Si vous vous demandez pourquoi Microsoft n’a pas implémenté cette fonctionnalité, il faut se dire que c’est probablement à cause d’un souci d’intégrité.
Si seulement une table est restaurée de la sauvegarde et que celle-ci n’est pas au même point que la base de données actuelle, cela pourrait avoir pour effet de bord de compromettre l’intégrité référentielle au sein de cette base.

Bien sûr, cela est vrai également si une restauration complète de la base de données est réalisée et qu’on ne copie la structure et les données d’une table en particulier. Donc dans tous les cas, il est nécessaire de prendre certaines précautions lors de la récupération des données d’une seule table spécifique.

Ci-dessous se trouve un diagramme contenant les étapes à respecter pour réaliser la restauration d’une seule table à partir d’une sauvegarde:

Diagram of the steps to take to recover a single table from a backup

  1. La première étape consiste à restaurer la dernière sauvegarde complète de la base de données ainsi que celles de tous les fichiers journaux (transaction logs) depuis cette sauvegarde complète jusqu’au moment le plus récent où les données étaient encore correctes. Cette restauration se fera en utilisant un autre nom de base de données sur le même serveur.

    Cette étape est la plus longue. Sa durée dépendra de la taille de la base de données a restauré.

    S’il est seulement nécessaire de restaurer les données de quelques tables, il peut être plus rapide d’utiliser l’outil de restauration ApexSQL Recover pour extraire les données des tables souhaitées dans une nouvelle base de données plutôt que de restaurer l’entièreté des tables. La procédure sera décrite plus loin dans cet article.

  2. La deuxième étape consiste à copier des données hors de la sauvegarde dans la base de données ciblée.

    En fonction du scénario envisagé, il est nécessaire d’utiliser une des techniques suivantes:

    1. Si la table existe encore mais que certaines lignes ont été supprimées:

      Utiliser les commandes USE, INSERT et SELECT pour réinsérer uniquement les lignes manquantes dans la table

      USE AdventureWorks2012
      GO
      SET IDENTITY_INSERT Production.Illustration ON
      INSERT INTO Production.Illustration 
      (IllustrationID,Diagram,ModifiedDate)
      SELECT * FROM AdventureWorks2012_Restored.Production.Illustration
      SET IDENTITY_INSERT Production.Illustration OFF
      
    2. Si la table a été complétement supprimée

      Utiliser la commande SELECT INTO pour copier les lignes et la structure de la table dans la base de données

      USE AdventureWorks2012
      GO
      SELECT * INTO Production.Illustration 
      FROM AdventureWorks2012_Restored.Production.Illustration
    3. If some rows were damaged perhaps through a malicious update or some other unwanted event

      The MERGE statement may be used to update damaged or insert data which is missing, or even delete rows which should not be there

      USE AdventureWorks2012
      GO
      SET IDENTITY_INSERT Production.Illustration ON
      MERGE Production.Illustration dest
      USING (SELECT * FROM AdventureWorks2012_Restored.Production.Illustration src) AS src
                    ON dest.IllustrationID = src.IllustrationID
      WHEN MATCHED THEN UPDATE 
      SET dest.Diagram = src.Diagram, dest.ModifiedDate = src.ModifiedDate
      WHEN NOT MATCHED THEN INSERT
      (IllustrationID,Diagram,ModifiedDate) VALUES 
      (src.IllustrationID,src.Diagram,src.ModifiedDate);
      SET IDENTITY_INSERT Production.Illustration OFF
  3. La troisième étape consiste à récréer tous les index, les déclencheurs (triggers) ou les contraintes, si nécessaire
  4. La quatrième étape consiste à résoudre les problèmes d’intégrité

    Il s’agit d’un processus manuel inévitable et qu’on ne peut malheureusement éviter

  5. La cinquième étape consiste à exécuter la commande DBCC CCHECKTABLE dans la table afin de vérifier l’intégrité des données

    DBCC CHECKTABLE ("Production.Illustration")

Comme promis ci-dessus au niveau de la première étape, vous trouverez ci-dessous une explication de l’utilisation de l’outil de récupération ApexSQL Recover pour extraire les données souhaitées sans restaurer toute la base de données

  1. L’outil de récupération ApexSQL Recover offre une multitude d’options pour récupérer une base de données

    Plus vous aurez d’information sur l’évènement qui vient de se passer, plus il sera facile de récupérer votre base de données grâce à cet outil

    Par exemple, si vous savez que la table a été supprimées via la commande DROP TABLE ou supprimée en utilisant SSMS, vous pouvez utiliser l’option spécifique From DROP TABLE de l’outil qui permet de récupérer les données d’une base de données suite à l’utilisation de cette commande (DROP TABLE). Cela permettra à l’outil de récupération de trouver les données plus rapidement ; puisqu’il n’a besoin de chercher qu’après les données qui ont été supprimées via cette commande

    Choisissons cette option pour l’exemple

  2. Pour continuer, il est nécessaire de se connecter au serveur de la base données SQL sur lequel l’évènement s’est produit:

  3. Fournissez les détails de connexion
  4. Cliquez sur Suivant (Next)

    Cet écran vous permet d’ajouter les sauvegardes des bases de données ainsi que les sauvegardes du journal de transactions (transaction log) dont vous disposez. Si vous n’avez pas de sauvegarde disponible, l’outil de récupération essayera seulement de récupérer les données à partir de la base de données sur laquelle vous êtes connecté

    En fonction du temps qui s’est écoulé depuis que la table eut été supprimée, très peu d’information peuvent être encore disponible dans la base de données elle-même. Si vous avez des sauvegardes disponibles, il est essentiel de les ajouter. Cela permettra d’accélérer la récupération des données et améliorera également la qualité des données récupérées

  5. Sélectionnez l’option Add transaction logs afin d’ajouter les sauvegardes des journaux de transactions des différents évènements au sein du programme de récupération des données

  6. Ajouter toutes les sauvegardes dont vous disposez
  7. Cliquez sur Next (suivant)

    Si vous savez le moment approximatif où les données ont été perdues, sélectionnez l’option la plus appropriée. Spécifier un moment approximatif accélèrera le processus de récupération des données

  8. Sélectionner l’option pertinente

  9. Cliquez sur Next (suivant)

    L’outil de récupération ApexSQL Recover vous permet d’écrire les données extraites dans un fichier ou bien une nouvelle base de données

  10. Sélectionnez l’action de récupération souhaitée

  11. Spécifiez le nom de la base de données qui doit être créée, si cela est d’application

  12. Cliquez sur Next (suivant)

    Ici vous pouvez choisir si vous récupérez la structure de la table et ses données (1er choix) ou bien uniquement sa structure (2ème choix)

  13. Sélectionnez l’option de récupération souhaitée
  14. Cliquer sur Recover (Récupération)

    Un écran de rapport apparaîtra pour vous faire savoir quelles tables ont été récupérées

En conclusion

Quand quelque chose se passe mal et qu’une table est supprimée ou accidentellement tronquée, vous n’avez généralement pas le temps de restaurer l’entièreté de la base de données.
Lorsque cela se produit, l’outil de récupération ApexSQL Recover est la réponse à votre problème.

L’outil de récupération ApexSQL Recover peut identifier les données associées à une table spécifique et extraire uniquement les données pertinentes issues des sauvegardes de vos bases de données SQL Server. Cela vous fera gagner un temps précieux en vous évitant de faire une restauration complète.

Téléchargements

Veuillez télécharger le(s) script(s) associé(s) à cet article sur notre dépôt GitHub.

N’hésitez pas à nous contacter si vous deviez rencontrer des problèmes ou si vous avez des questions sur les scripts.

 

September 1, 2017