4 techniques pour la récupération des tables perdues en raison de l’opération de DROP Table

Une table accidentellement supprimée peut être recupérée de plusieurs façons. Le choix de la technique dépend des ressources disponibles pour la récupération. Le premier choix est habituellement une sauvegarde de base de données. Mais, même si vous n’en avez pas, la table supprimée peut toujours être récupérée (dans certains cas encore plus rapidement que si vous aviez une sauvegarde).

Nous allons voir comment cela peut se faire:

Utilisez SQL Server Management Studio

S’il y a une sauvegarde complète, ou une chaîne de sauvegardes différentielles contenant la table supprimée:

  1. Restaurer la base de données sur un serveur de test
  2. Dans SQL Server Management Studio, cliquez-droit sur la base de données, sélectionnez Tasks et puis Generate Scripts

    SSMS Object Explorer - Generate Scripts command

  3. Dans la liste d’objets, sélectionnez la table supprimée

    Selecting specific database objects to script

  4. Dans la boîte de dialogue Set Scripting Options, spécifiez le chemin d’accès et le nom

    Specifying the file path and name in the Set Scripting Options dialog

  5. Cliquez sur Advanced et cocher:
    • Generate script for Dependent objects – pour décrire les objets qui dépendent de la table supprimée. Remarquez que vous ne pouvez pas supprimer une table sans enlever la contrainte référencement ou la table
    • Types of data to script – sélectionnez le schéma et les données si vous souhaitez également récupérer les données perdues
  6. Une fois que le script a été généré, vous pouvez l’ouvrir, l’examiner et le modifier. Le script crée la table supprimée tout d’abord et puis insère les données supprimées:
    CREATE TABLE [dbo].[Orders](
    	[Id] [int] NOT NULL,
    	[OrderNo] [int] NOT NULL,
    	[CustomerId] [int] NULL,
    	[OrderDate] [date] NULL
    ) ON [PRIMARY]
    
    GO
    INSERT [dbo].[Orders] ([Id], [OrderNo], [CustomerId], [OrderDate]) 
    VALUES (1, 1000, 35, CAST(0x2A370B00 AS Date)) ALTER TABLE [dbo].[Orders] ADD DEFAULT (getdate()) FOR [OrderDate] GO
  7. Exécutez le script sur la base de données originale

Cette méthode est simple et directe, le seul problème étant que cela ne fonctionne seulement s’il y a une sauvegarde de votre base de données. En outre, si la base de données est volumineuse, la restauration de sauvegarde peut être très longue.

Utilisez ApexSQL Diff

Il s’agit d’une autre méthode où une sauvegarde de base de données est nécessaire, mais il n’a pas à être restauré afin de récupérer des tableaux perdus en raison de l’opération de DROP Table.

ApexSQL Diff est un outil de comparaison et de synchronisation de bases de données SQL Server. Il détecte les différences entre les objets de base de données, génère des rapports complets et synchronise les bases lives et versionnées, les sauvegardes, les snapshots instantanés et les dossiers de scripts.

  1. Démarrer ApexSQL Diff
  2. Dans la boîte de dialogue Project Management, cliquez sur New pour créer un nouveau projet
  3. Dans le volet Source, sélectionnez Backup comme Data source type
  4. Cliquez sur Add files, ajouter une sauvegarde complète, ou une sauvegarde complète et une série de sauvegardes différentielles et vérifiez-les
  5. Dans le volet de Destination, sélectionnez Database comme le Data source type
  6. Sélectionnez la base de données active et le type d’authentification

    Selecting the live database and authentication type in ApexSQL Diff

  7. Cliquez sur Show Advanced tabs
  8. Dans Object filter, cochez Use filter pour les tables

    Checking the Use filter for the tables in Object filter

    Pour avoir tous les objets qui dépendent de la table supprimée dans le scénario – triggers, tables, etc. laissent tous types d’objets sélectionnés.

  9. Dans le volet de Tables filter, ne cochez que la table supprimée

    Selecting the dropped table in the Tables filter pane

  10. Cliquez Compare

    ApexSQL Diff affichera les résultats de la comparaison dans la grille principale. La table supprimée et les objets qui en dépendent, le cas échéant, seront montrés dans la grille:

    The comparison results shown in the main grid of ApexSQL Diff

  11. Sélectionnez la table dans la grille principale
  12. Cliquez sur Synchronize dans le menu
  13. Pour le script des objets qui dépendent de la table supprimée, sélectionnez-les dans la liste d’objets dépendants
  14. Aller au Synchronization wizard
  15. Dans l’étape des Output options, sélectionnez Create a synchronization script comme output action

    Choosing the Synchronization output options

  16. Cliquez Done
  17. Le script généré s’affichera dans l’éditeur ApexSQL Diff. Examiner, modifier le si besoin est et exécutez le

    Batch synchronizing - ApexSQL Diff internal editor

La table et les objets dépendants sélectionnés seront recréés.

Puisque ApexSQL Diff peut lire des sauvegardes de base de données SQL Server, la récupération de la table est plus rapide car les sauvegardes ne sont pas d’abord restaurées. Les objets dépendants de la table supprimée sont parfaitement restaurés. La grille principale affiche le script et les différences pour chaque objet, fournissant une granularité qui aide à déterminer quels sont les objets à sélectionner pour la synchronisation.

Si vous n’avez pas de sauvegarde de base de données SQL, cette méthode n’est pas applicable. En outre, seule la structure de la table peut être Récupérée.

Utiliser ApexSQL Log

Même s’il n’y a aucune sauvegarde de base de données SQL contenant la table supprimée, il est possible de récupérer des tableaux perdus en raison de l’opération de DROP Table.

ApexSQL Log est un viewer du SQL server transaction log qui audite, rétablit ou relit les données et l’objet de modifications. Il restaure les données supprimées et modifiées ainsi que let objets, en capturant les informations sur l’utilisateur, l’application et l’hôte utilisés pour faire les changements.

  1. Démarrer ApexSQL Log
  2. Connectez a la base de données live dans laquelle la table a été supprimée
  3. Dans l’étape suivante, choisissez ajoutez des backups des transaction logs qui ont été créés après que la table est été supprimée. Notez que les transactions logs doivent former une chaine complete sans chaînon manquant
  4. Cliquez Next
  5. Dans le paneau Operations, déselectionnez toutes les DML ainsi que toutes led DML et cochez DROP Table dans la liste Schema operations

    Selecting only DROP Table in the Schema operations list

  6. Cliquez Next et choisissez Open results in grid option
  7. Toutes les opérations de drop table qui existent dans le log des transactions et les backups de transactions logs ajoutés seront affichés dans la grille principale
  8. Sélectionnez la table que vous souhaitez récupérer, sélectionnez l’option Create undo script dans le menu

    Create undo script selection in the context menu

  9. Une fois le script créé, examinez-le, et exécutez-le

    The undo script has been created

Les avantages de ce procédé sont qu’il n’est pas nécessaire d’avoir une sauvegarde de sa base de données. Comme une instruction DROP TABLE ne crée pas une ligne dans le transaction log, cette méthode peut récupérer seulement la structure de la table.

Notez que si la base de données est en mode SIMPLE RECOVERY, les transactions peuvent être écrasées. Dans ce cas, le plus tôt vous exécutez ApexSQL Log, plus grandes sont vos chances de réussite.

Utiliser ApexSQL Recover

ApexSQL Recover lit les données (MDF) et les fichiers de transaction log (LDF), il peut récupérer une table supprimée même lorsque la transaction n’existe pas dans le fichier LDF.

ApexSQL Recover est un outil de récupération de SQL Server qui récupère les données supprimées, tronquées, corrompues ou endommagées. Il récupère les objets et les données perdues ou supprimées ainsi que les BLOBs sous forme de fichiers.

  1. Lancez ApexSQL Recover
  2. Sélectionnez la récupération de données de l’option From DROP TABLE operation

    Data and Object recovery options selection

  3. Connectez-vous à la base de données en direct
  4. Cliquez sur Next
  5. Si il ya des backups du transaction log créés après que la table ait été supprimée, ou un transaction log détaché contenant la transaction responsable de la suppressions, cliquez sur Add transaction logs

    Checking if there are additional data sources available for the recovery

  6. Dans l’étape suivante, ajoutez les sauvegardes des transactions logs ainsi que les transactions logs individuels

    Adding the transaction log backups and the detached transaction logs

  7. Sélectionnez la période où la table a été supprimée. Si vous n’êtes pas sûr de la date exacte, choisissez l’option Date and time are unknown
  8. Si nécessaire, modifier l’emplacement et le nom du fichier pour le script de récupération, et cliquez sur Recover
  9. Une fois le script de récupération généré, ouvrez-ler, trouvez les tables que vous souhaitez récupérer et exécutez-le

Grâce à la lecture des deux fichiers : MDF et LDF, ApexSQL Recover a plus de chances de récupération réussie.

Cependant, si les informations sur la table supprimée sont écrasées dans les deux fichiers MDF et LDF, ApexSQL Revoever ne peut pas vous aider.

Avoir des sauvegardes de base de données est un bon point de départ, mais pas nécessairement le plus rapide. Avec les sauvegardes, il existe différentes méthodes – celles qui nécessitent une restauration de la sauvegarde et donc plus de temps, et celles qui peuvent lire des sauvegardes directement.

Si vous ne disposez pas d’une sauvegarde de base de données, vous pouvez récupérer une table supprimée à partir des données de base de données SQL et les transactions logs.

Quant à la récupération d’une base de données dans le modèle SIMPLE RECOVERY, cela peut échouer si la transaction drop table a été écrasée. Même alors, la récupération est possible à partir du fichier MDF.

Article traduit par Régis Baccaro

 

August 19, 2015