4 técnicas para recuperar tablas perdidas debido a una operación DROP Table

Una tabla accidentalmente borrada puede ser recuperada de muchas maneras. La elección de la técnica depende de los recursos disponibles para la recuperación. La primera elección es usualmente una copia de seguridad de la base de datos. Pero incluso si usted tiene una, la tabla borrada puede ser aún recuperada (en algunos casos incluso más rápidamente que con una copia de seguridad).

Veamos cómo esto puede ser hecho.

Use SQL Server Management Studio

Si tiene una copia de seguridad completa de la base de datos, o una cadena de copias de seguridad diferenciales que contienen la tabla borrada:

  1. Restaure la base de datos en un servidor de prueba
  2. En SQL Server Management Studio, haga clic derecho en la base de datos, seleccione Tasks y luego Generate Scripts

    SSMS Object Explorer - Generate Scripts command

  3. En la lista de objetos, seleccione la tabla borrada

    Selecting specific database objects to script

  4. En el diálogo Set Scripting Options especifique la ruta del archivo y el nombre

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

  5. Haga clic en Advanced y seleccione:
    • Generate script for Dependent objects – para codificar los objetos que dependen de la tabla borrada. Note que usted no puede borrar una tabla sin remover la restricción de referencia o la tabla primero.
    • Tipos de datos para codificar – seleccione Schema y los datos si desea recuperar los registros perdidos también
  6. Una vez que el script ha sido generado, usted puede abrirlo, revisarlo y modificarlo. El script crea la tabla borrada primero, y luego inserta los registros borrados:
    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. Ejecute el script contra la base de datos original

Este método es simple y sencillo, siendo el único contratiempo que no es aplicable si no hay una copia de seguridad de la base de datos. También, si la base de datos es grande, la restauración de la copia de seguridad puede consumir mucho tiempo.

Use ApexSQL Diff

Hay otro método donde una copia de seguridad de la base de datos es necesaria, pero no tiene que ser restaurada para recuperar tablas perdidas debido a una operación DROP Table.

ApexSQL Diff es una herramienta de sincronización y comparación para bases de datos SQL Server. Detecta diferencias entre objetos de bases de datos, genera reportes detallados y sincroniza bases de datos en vivo y versionadas, copias de seguridad de bases de datos, snapshots y carpetas de scripts.

  1. Inicie ApexSQL Diff
  2. En el diálogo Project Management, haga clic en New para crear un nuevo proyecto
  3. En el panel Source, seleccione Backup como Data source type
  4. Haga clic en Add files, añada una copia de seguridad complete de la base de datos, o una copia de seguridad complete de la base de datos y una cadena de copias de seguridad diferencial de la base de datos, y selecciónelos.
  5. En el panel Destination, seleccione Database como Data source type
  6. Seleccione la base de datos en vivo y el tipo de autenticación

    Selecting the live database and authentication type in ApexSQL Diff

  7. Haga clic en Show Advance tabs
  8. En Object filter, seleccione Use filter para las tablas

    Checking the Use filter for the tables in Object filter

    Para que todos los objetos que dependen de la tabla borrada estén correctamente codificados – desencadenadores, tablas, etc., deje todos los tipos de objetos seleccionados.

  9. En el panel Tables filter, seleccione sólo la tabla borrada

    Selecting the dropped table in the Tables filter pane

  10. Haga clic en Compare

    ApexSQL Diff mostrará los resultados de la comparación en la cuadrícula principal. La tabla borrada y los objetos que dependen de ella, si hay alguno, serán mostrados en la cuadrícula.

    The comparison results shown in the main grid of ApexSQL Diff

  11. Seleccione la tabla en la cuadrícula principal
  12. Haga clic en Synchronize en el menú
  13. Para codificar los objetos de los que depende la tabla borrada, selecciónelos desde la lista de objetos dependientes
  14. Siga el Synchronization wizard
  15. En el paso Output options, seleccione Create a synchronization en Output action

    Choosing the Synchronization output options

  16. Haga clic en Done
  17. El script generado será mostrado en el editor interno de ApexSQL Diff. Revíselo, modifíquelo si es necesario, y ejecútelo

    Batch synchronizing - ApexSQL Diff internal editor

La tabla y los objetos dependientes seleccionados serán recreados.

Como ApexSQL Diff puede leer copias de seguridad de bases de datos SQL Server, la recuperación de la tabla es más rápida cuando las copias de seguridad no están siendo restauradas primero. Los objetos que dependen de la tabla borrada son recuperados sin problemas. La cuadrícula principal muestra el script y las diferencias para cada objeto, lo cual provee granularidad y ayuda en decidir qué objetos seleccionar para la sincronización.

SI usted no tiene una copia de seguridad de la base de datos SQL, este método no es aplicable. También, sólo la estructura de la tabla puede ser recuperada.

Use ApexSQL Log

Incluso si no hay una copia de seguridad de la base de datos SQL que contenga la tabla borrada, la recuperación de tablas perdidas debido a una operación DROP Table puede ser hecha.

ApexSQL Log es un visor de registros de transacciones de SQL Server que audita, revierte o reproduce cambios de datos y objetos. Restaura objetos y datos eliminados o modificados, capturando información acerca del usuario, la aplicación y el anfitrión usados para hacer cada cambio.

  1. Inicie ApexSQL Log
  2. Conéctese a la base de datos en vivo en la cual la tabla ha sido borrada
  3. En el siguiente paso Añada copias de seguridad de registros de transacciones creados después de que la tabla fue borrada. Por favor note que los registros de transacciones tienen que formar una cadena completa
  4. Haga clic en Next
  5. En la pestaña Operations, des-seleccione todas las operaciones de datos (DML) y esquema (DDL). Seleccione sólo DROP Table en la lista de Schema operations

    Selecting only DROP Table in the Schema operations list

  6. Haga clic en Next y seleccione Open results in grid option
  7. Todas las operaciones drop table que existen en el registro de transacciones en línea y las copias de seguridad de registros añadidas serán mostradas en la cuadrícula principal
  8. Seleccione la tabla que desea recuperar, seleccione la opción Create undo script del menú

    Create undo script selection in the context menu

  9. Una vez que el script deshacer ha sido creado, revíselo y ejecútelo

    The undo script has been created

Las ventajas de este método son que no es necesaria una copia de seguridad de la base de datos. Como una sentencia DROP TABLE no crea un registro para cada fila de la tabla en el registro de transacciones en línea, este método puede recuperar sólo la estructura de la tabla.

Note que si la base de datos está en el modelo de recuperación simple, las transacciones podrían haber sido sobrescritas. En este caso, mientras más pronto ejecute ApexSQL Log después de que la tabla fue borrada, mayores serán las posibilidades de una recuperación exitosa.

Use ApexSQL Recover

Como ApexSQL Recover lee tanto archivos de datos (MDF) como de registros de transacciones (LDF), puede recuperar una tabla borrada incluso cuando la transacción ya no existe en el archivo LDF.

ApexSQL Recover es una herramienta de recuperación de SQL Server que recupera datos eliminados, truncados, corruptos o dañados. Recupera objetos y datos perdidos debido a operaciones drop y restaura BLOBS tanto eliminados como en línea como archivos.

  1. inicie ApexSQL Recover
  2. Seleccione la opción de recuperación de datos From DROP TABLE operation

    Data and Object recovery options selection

  3. Conéctese a la base de datos en vivo
  4. Haga clic en Next
  5. Si hay copias de seguridad de registros de transacciones creadas después de que la tabla fue borrada, o un registro de transacciones suelto que contiene la transacción responsable para el borrado, haga clic en Add transaction logs

    Checking if there are additional data sources available for the recovery

  6. En el siguiente paso, Añada las copias de seguridad de registros de transacciones y los registros de transacciones sueltos

    Adding the transaction log backups and the detached transaction logs

  7. Seleccione el periodo de tiempo cuando la tabla fue borrada. Si no está seguro cuándo pasó, deje la opción Date and time are unknown seleccionada
  8. Si es necesario, modifique la ruta del archivo y el nombre para el script de recuperación, y haga clic en Recover
  9. Una vez que el script de recuperación ha sido generado, revíselo, encuentre las tablas que desea recuperar y ejecute

Gracias a que puede leer archivos tanto MDF como LDF, ApexSQL Recover tiene más posibilidades de una recuperación exitosa. De todas maneras, si la información acerca de la tabla borrada es sobrescrita en los archivos MDF y LDF, ApexSQL Recover no puede ayudar.

Tener copias de seguridad de la base de datos es un buen punto de partida, pero puede no ser ser el más rápido. Con copias de seguridad, hay diferentes métodos – los que requieren que una copia de seguridad se restaure primero, y por tanto requieren más tiempo, y los otros que pueden leer copias de seguridad.

Si usted no tiene una copia de seguridad de la base de datos, usted puede recuperar una tabla borrada de los archivos de registros de transacciones y de la base de datos SQL. Cuando se trata de recuperar desde una base de datos en el modelo de recuperación simple, puede que falle dado que la transacción drop table puede haber sido sobrescrita. Incluso así, la recuperación es posible desde el archivo MDF

Traductor: Daniel Calbimonte

junio 4, 2015