Restaurando bases de datos en LocalDB

Acabo de empezar un nuevo proyecto como freelance y un miembro del equipo me dejo copiado un backup de la base de datos del proyecto en el pen drive. Son case las 2 a.m. en Perú y estoy aprovechando que mis hijos duermen y que una ves mas me invadió el insomnio para poder avanzar con el proyecto. Lamentablemente he re formateado mi buena Dell Inspirion con la llegada de Windows 8.1 y por no querer esperar la descarga de unos cuantos gigabytes no le instale SQL Server 2012,(ademas últimamente estoy usando bases de datos NoSql como RavenDB). Pero tengo Visual Studio 2013 con LocalDB así que tuve la idea de restaurar la base de datos allí. 

Con lo que me tope fue con una serie de errores que terminaron por consumir mucho de mi tiempo, pero finalmente revisando un poco de documentación y con un poco de ingenio, en casi 30 minutos pude obtener la base de datos, a continuación dejo los diversos pasos que se necesitan por si alguien lo intenta alguna ves.

En primer lugar vamos a necesitar algunas claves en el registro de Windows:

  1. HKEY_LOCAL_MACHINESOFTWAREMicrosoftMicrosoft SQL ServerMSSQL11E.LOCALDBMSSQLServerDefaultData
  2. HKEY_LOCAL_MACHINESOFTWAREMicrosoftMicrosoft SQL ServerMSSQL11E.LOCALDBMSSQLServerDefaultLog
  3. HKEY_LOCAL_MACHINESOFTWAREMicrosoftMicrosoft SQL ServerMSSQL11E.LOCALDBMSSQLServerBackupDirectory

Todas de tipo string, y en la cuales se deben de poner la ruta a un directorio, en mi caso yo he usado “D:SQLServerLocalDBDatabases”

Luego desde Visual Studio en la pestaña de SQL Server Object Explorer creamos una nueva consulta en la instancia “v11.0” de LocalDB y ejecutamos :

Restore FILELISTONLY  From Disk=’E:BackupDB.bak’

Esto nos debería de mostrar el nombre lógico y físico de los archivos de datos y de log de la base de datos a restaurar. Luego de contar con esos nombres pues lo lógico es ejecutar:

RESTORE DATABASE DB01

From Disk=’E:BackupDB.bak’

WITH

REPLACE,

RECOVERY,

MOVE ‘DB01_Data’ TO ‘C:SQLServerLocalDBDatabasesDB01.mdf’,

MOVE ‘DB01_Log’ TO  ‘C:SQLServerLocalDBDatabasesDB01_log.ldf’, 

STATS=5 

Hasta aquí nada nuevo simplemente consultamos el archivo de backup por información de la base de datos que contiene y luego intentamos restaurarla de la manera normal con esto se restauro el archivo de datos (mdf) pero no se pudo restaurar el log por el siguiente error.

The logical database file ‘BD01_Log’ cannot be found. Specify the full path for the file. 

Si bien el Object Explorer me mostraba la base de datos esta no podía ser iniciada.Consultando en diversos lugares aparentemente es un problema de LocalDB. Lo primero entonces era obtener los archivos de la base de datos para lo cual intente restaurarla usando el parámetro NONRECOVERY en lugar del parámetro RECOVERY. Con esto pude comprobar que tanto el archivo mdf como ldf estaban en la ubicación que había establecido para ellos.

Ya con estos dos archivos necesitaba una forma de poder adjuntarles a la instancia de LocalDB para ello tuve que:

  • Detener y eliminar la instancia de LocalDB (ojo con esto tendrás que volver a adjuntar -attach- manualmente todas las bases de datos que tengas en esa instancia).

C:Program FilesMicrosoft SQL Server110ToolsBinn>SqlLocalDB.exe p “v11.0”

C:Program FilesMicrosoft SQL Server110ToolsBinn>SqlLocalDB.exe d “v11.0”

  • Volver a crear la instancia de “v11.0” e iniciarla.

C:Program FilesMicrosoft SQL Server110ToolsBinn>SqlLocalDB.exe c “v11.0” 

C:Program FilesMicrosoft SQL Server110ToolsBinn>SqlLocalDB.exe s “v11.0”

Finalmente hay que adjuntar nuevamente los archivos

CREATE DATABASE DB01

    ON (FILENAME = ‘C:SQLServerLocalDBDatabasesDB01.mdf’), 

    (FILENAME = ‘C:SQLServerLocalDBDatabasesDB01_log.ldf’) 

    FOR ATTACH; 

Y listo la base de datos en restaurada en LocalDB. Espero poder tomarme unos minutos mas para entender a fondo algunas cosas mas de este comportamiento de LocalDB pero por el momento necesito trabajar con esa base datos, si alguien sabe algo mas al respecto pues bienvenidas los comentarios.

 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *