Cómo recuperar un objeto borrado específico

Incluso tomando todas las precauciones, percances con su base de datos aún son una posibilidad. Aunque usted esté preparado para un desastre – su base de datos está en un modelo de recuperación completo y usted crea copias de seguridad del registro de transacciones y la base de datos regularmente, aún hay algunas situaciones cuando un problema no puede ser resuelto usando una solución ya disponible por defecto.

Uno de estos problemas es restaurar un solo objeto. No es inusual eliminar un objeto de base de datos SQL (por ejemplo, un procedimiento almacenado) que aún es necesitado, o modificarlo cuando la versión antigua pueda ser requerida después.

Cómo restaurar un procedimiento almacenado sin demasiados problemas

Los sistemas de control de versiones proveen la funcionalidad que usted necesita. Pero esto no es aplicable si usted no tiene el objeto ya versionado y todo lo que tiene es una copia de seguridad de la base de datos.

Restaurando la copia de seguridad de la base de datos completa

Usted tiene una copia de seguridad de la base de datos completa con el objeto que necesita, pero no puede restaurarla sobre la base de datos existente, dado que todos los otros cambios hechos después de que la copia de seguridad de la base de datos completa fuera creada serán sobrescritos.

La solución es:

  1. Restaurar la copia de seguridad de la base de datos completa en un servidor de prueba
  2. Para crear un script DDL para el objeto que necesita, haga clic derecho en el procedimiento almacenado que quiere restaurar en Object Explorer de SQL Server Management Studio.
  3. Seleccione Script Stored procedure as | Create To | New Query Editor Window

    SQL Server Management Studio

  4. Cuando el script sea generado, ejecútelo contra la base de datos original.

La desventaja de este método es que, para bases de datos muy grandes, restaurar una base de datos toma mucho tiempo y espacio, así que este método es muy ineficiente.

Recuperar desde el cache

Si el procedimiento almacenado ha sido ejecutado recientemente, hay una posibilidad de que aún esté en el cache.

  1. Ejecute el siguiente SQL para leer el cache

    SELECT
           Cached.refcounts,
           Cached.usecounts,
           Cached.objtype,
           SQLText.dbid,
           SQLText.objectid,
           SQLText.text,
           Query.query_plan
      FROM
           sys.dm_exec_cached_plans Cached
           CROSS APPLY sys.dm_exec_sql_text(Cached.plan_handle)SQLText
                 CROSS APPLY sys.dm_exec_query_plan(Cached.plan_handle)Query
    

  2. Verifique los resultados

    SQL Server Management Studio results

  3. Si encuentra el procedimiento almacenado que necesita, copies u columna de texto

La ventaja de este método es que usted ni siquiera necesita una copia de seguridad de la base de datos completa. La desventaja es que si el procedimiento almacenado no ha sido ejecutado recientemente, usted no podrá recuperar el procedimiento almacenado.

ApexSQL Diff es una herramienta de comparación y sincronización de base de datos que detecta diferencias entre objetos de bases de datos y los resuelve sin errores. Tiene un filtro granular que permite comprar sólo objetos específicos. Mientras lee las copias de seguridad de bases de datos, usted puede compararlas sin restaurarlas primero.

  1. Inicie ApexSQL Diff
  2. Haga clic en New en el diálogo Project management

    ApexSQL Diff Project dialog

  3. En el panel Source:
    • Seleccione Backup desde el menú desplegable Type
    • Seleccione el conjunto de copias de seguridad desde el archivo de copia de seguridad
    • En el panel Destination:
    • Seleccione Database desde el menú desplegable Type
    • Especifique la instancia SQL con la base de datos desde el menú desplegable Server
    • Especifique el método de autenticación para esa instancia SQL (y un conjunto válido de credenciales si usted elige autenticación de SQL Server)
    • Especifique el nombre de la base de datos en el menú desplegable Database
  4. Haga clic en Show advanced tabs
  5. Haga clic en Object filter
  6. Des-seleccione todos los tipos de objetos, excepto Stored Procedures
  7. Seleccione Use filter para procedimientos almacenados

    ApexSQL Diff Object filter

  8. En el árbol filtro, haga clic en Procedures
  9. Des-seleccione todos los procedimientos almacenados excepto el que quiere recuperar

    ApexSQL Diff Object filter

  10. Haga clic en Compare
  11. Seleccione el procedimiento almacenado que desea recuperar en la cuadrícula principal

    ApexSQL Diff Main grid

  12. Dirección de sincronización

  13. En la pestaña Home, en el grupo Actions, haga clic en Synchronize

  14. En el paso Synchronization direction del Synchronization wizard, haga clic en Next
  15. En el paso Dependencies del Synchronization wizard, haga clic en Next
  16. Revise el resumen de la sincronización y los avisos, si hubiera alguno, y haga clic en Next

    ApexSQL Diff Synchronization wizard

  17. En el paso Output options del Synchronization wizard, seleccione Create a synchronization script

    ApexSQL Diff Synchronization wizard

  18. Haga clic en Done
  19. Verifique el script y presione F5 para ejecutarlo

    Una vez que los procedimientos almacenados sean recreados, usted verá el siguiente mensaje:

Si usted perdió o modificó un procedimiento almacenado, no hay necesidad de restaurar la base de datos completa desde una copia de seguridad o buscar en el cache. Use ApexSQL Diff para crear un script DDL directamente desde la copia de seguridad de la base de datos sólo para el objeto que usted necesita restaurar.

Traductor: Daniel Calbimonte

junio 12, 2015