Cómo recuperar una tabla individual de una copia de seguridad de base de datos SQL Server

Cuando usted pregunta a un Administrador de Base de Datos (DBA, por sus siglas en inglés) qué característica le gustaría ver que se añada a la funcionalidad de recuperación de SQL Server, él indudablemente dirá: “La habilidad de recuperar una tabla individual de una copia de seguridad de base de datos”.

Por supuesto, es posible recuperar datos de una tabla específica de una copia de seguridad, pero usted no puede hacerlo sin restaurar la copia de seguridad entera.

¿Por qué los DBAs quieren esto? Bien, las razones son simples:

  1. Frecuentemente, el resto de la base de datos está bien, excepto que alguien accidentalmente dañó o eliminó una tabla específica.
  2. Restaurar una copia de seguridad entera puede tomar una cantidad significativa de tiempo y, generalmente, cuando una tabla ha sido dañada a tal nivel que una restauración es requerida, el DBA probablemente experimentará presión para hacerlo rápido.

Si tuviera que adivinar por qué Microsoft no ha provisto esta funcionalidad, tendría que decir que probablemente se relaciona a preocupaciones de integridad. Si usted extrae sólo una tabla de una copia de seguridad, lo cual no está en el mismo punto de tiempo que su base de datos actual, eso puede comprometer la integridad referencial. Por supuesto, esto es también cierto si usted restaura la copia de seguridad entera y después sólo copia la tabla especificada, así que de todas maneras esto es algo que siempre tiene que ser tomado en cuenta cuando se realice la recuperación de una tabla individual.

Aquí está el diagrama de los pasos que se requerirá realizar para recuperar una tabla individual de una copia de seguridad:

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

  1. Restaurar la última copia de seguridad de la base de datos SQL y todos los archivos de copias de seguridad de registros al punto de tiempo donde los datos eran correctos por última vez, como una base de datos con un nombre diferente en el mismo servidor.

    Esta es la parte del proceso que probablemente tome más tiempo para completarse, dependiendo del tamaño de su base de datos.

    Si usted sólo necesita extraer datos para un par de tablas, puede ser más rápido usar ApexSQL Recover para extraer los datos de la tabla a una nueva base de datos, en lugar de tener que restaurar la copia de seguridad entera. Yo le mostraré cómo esto puede ser hecho un poco más rápido más adelante en este artículo.

  2. Copie los datos de la copia de seguridad a la base de datos destino.

    Dependiendo del escenario en cuestión, usted puede usar una de las siguientes técnicas:

    1. Si la tabla aún existe, pero sólo algunas filas fueron eliminadas

      Use una declaración INSERT combinada con una declaración SELECT para insertar sólo las filas perdidas de vuelta en la tabla

      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 tabla fue completamente eliminada

      Use la declaración SELECT INTO para copiar las filas y la estructura de la tabla de vuelta a la base de datos

      USE AdventureWorks2012
      GO
      SELECT * INTO Production.Illustration 
      FROM AdventureWorks2012_Restored.Production.Illustration
    3. Si algunas filas fueron dañadas quizá a través de una actualización maliciosa o algún otro evento no deseado.

      La declaración MERGE puede ser usada para actualizar datos dañados o insertar datos perdidos, o incluso eliminar filas que no deberían estar ahí.

      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. Recree cualquier índice, desencadenador o restricción si es requerido.
  4. Resuelva los problemas de integridad referencial.

    Este es un proceso manual y desafortunadamente no hay otra manera. Simplemente tiene que ser hecho.

  5. Ejecute el comando DBCC CHECKTABLE en la tabla para verificar la integridad de los datos.

    DBCC CHECKTABLE ("Production.Illustration")

Como se prometió anteriormente, ahora mostraré cómo usted puede usar ApexSQL Recover para extraer aquellos datos para la tabla sin hacer una restauración completa de la base de datos.

SQL Data recovery and extract options found in ApexSQL Recover

  1. ApexSQL Recover ofrece un par de opciones para recuperar una tabla. Mientras más información tenga acerca del evento que ocurrió, es más fácil obtener la tabla de vuelta usando ApexSQl Recover.

    Por ejemplo, si usted sabe que la tabla fue eliminada con un comando DROP TABLE o usando SSMS, usted puede usar la opción para recuperar datos perdidos desde una operación DROP TABLE. Esto permite a ApexSQL Recover encontrar los datos rápidamente, dado que sólo necesita buscar las tablas eliminadas.

    Elijamos esa opción ahora.

  2. Se requerirá que usted se conecte a la base de datos SQL Server desde donde la tabla fue eliminada.

    Selecting the SQL database to recover using one of the recovery wizards found in ApexSQL Recover

  3. Provea los detalles de la conexión.
  4. Haga clic en Next

    Selecting the additional data sources (if any) using one of the recovery wizards found in ApexSQL Recover

    Esta pantalla le permite añadir cualquier copia de seguridad de base de datos que usted tenga. Si usted no tiene copias de seguridad disponibles, ApexSQl Recover sólo intentará recuperar datos desde la base de datos a la que usted está conectado actualmente.

    Dependiendo de hace cuánto se eliminó la tabla, muy poca información puede estar disponible en la base datos SQL Server en sí. Si usted no tiene copias de seguridad disponibles, usted debería añadirlas aquí, esto no sólo acelerará la recuperación de sus datos, sino que también mejorará la calidad de los datos recuperados.

  5. Seleccione la opción Add transaction logs

    Specifying additional data sources for the recovery

  6. Añada todas las copias de seguridad que tenga disponibles.
  7. Haga clic en Next

    Specifying the date and time when the data was lost

    Si usted conoce el tiempo aproximado en el que ocurrió el evento, elija la opción relevante aquí. Dar un tiempo aproximado acelerará la operación.

  8. Seleccione la opción relevante.
  9. Haga clic en Next

    Recover database - Selecting to recover data to a new database

    ApexSQL Recover le permite escribir los datos extraídos a un archivo script o extraerlos a una nueva base de datos.

  10. Seleccione su acción de recuperación.
  11. Especifique el nombre de la base de datos SQL Server a ser creada, si aplica.
  12. Haga clic en Next

    Choosing to recover either the structure and the data, or only the table structure

  13. Seleccione su opción de recuperación.
  14. Haga clic en Recover

    Result screen showing what tables were recovered

    Una pantalla de resultados se mostrará qué tablas fueron recuperadas.

Conclusión

Cuando algo va mal y una tabla es eliminada o accidentalmente truncada, puede que usted no tenga suficiente tiempo para restaurar una base de datos entera. Cuando esto pasa, ApexSQL Recover es la respuesta.

Traductor: Daniel Calbimonte

Octubre 25, 2015