Restaurar base de datos SQL si no es a las buenas, a las malas, usando SMO :D

Si están usando SQL Server Management Studio para restaurar un backup de una base de datos, puede que en algunas casos se encuentren con el siguiente mensaje:

Exclusive Access could not be obtained because the database is in use

La opción, de eliminar la base de datos para remover las conexiones existentes, puede ser válida, pero también podemos usar el siguiente query para remover las conexiones existentes:

   1: use master
   2: go
   3: alter database <dbname> set single_user with rollback immediate
   4: alter database <dbname> set multi_user 

No es un query que resuelva el problema directamente, es un artificio, pero funciona :).

Encontré un código haciendo uso de SMO, que además de hacer el backup, incluye una instrucción que detiene los procesos asociados a una base de datos.

SMO, es una de las novedades de SQL Server 2005:

SQL Management Objects
“SMO (SQL Management Objects) es un nuevo conjunto de objetos de programación que cuenta con toda la funcionalidad de administración de la base de datos de SQL Server. De hecho, Management Studio se creó con SQL Management Objects. SMO se implementa como un ensamblado de Microsoft .NET Framework. Se puede utilizar SMO para automatizar las tareas administrativas habituales de SQL Server, como la recuperación mediante programación de los valores de configuración, la creación de nuevas bases de datos, la aplicación de secuencias de comandos de Transact-SQL, la creación de trabajos de SQL Server Agent y la programación de copias de seguridad. El modelo de objetos SMO es una sustitución más segura, confiable y escalable de los Objetos de administración distribuida (DMO), que se incluyó en las versiones anteriores de SQL Server”.

En otras palabras, con SMO vamos a poder programar las tareas que hacemos desde Microsoft SQL Server Management Studio desde .NET :D.

Humberto Martinez, ha publicado una entrada, jugando con SMO, donde crea dos funciones en .NET una para hacer un backup, y otra para restaurar una base de datos, aunque le falta ser un poco más parametrizable, como base esta muy claro el ejemplo :). El código esta en VB.NET, pero fácilmente traducible a C#. Los namespace necesarios para usar SMO, los podemos encontrar en este How to: Create a Visual C# SMO Project in Visual Studio .NET.

En esta otra entrada: Killing ProcessIDs using SMO, tiene el código para restaurar una base y además matar a los procesos asociados a una base de datos:

   1: internal void RestoreDatabase(string backupFileName, string databaseName)
   2:  {    
   3:     Restore restore = new Restore();
   4:     restore.Database = databaseName;
   5:  
   6:  
   7:     restore.Devices.AddDevice(backupFileName, DeviceType.File);
   8:     restore.ReplaceDatabase = true;
   9:     _server.KillAllProcesses(databaseName);
  10:     restore.Wait();
  11:     restore.SqlRestore(_server);
  12:   }

La línea adicional es la línea en que se llama al método KillAllProcesses de la variable _server, que debe ser una instancia de la clase Microsoft.SqlServer.Management.Smo.Server. Todos los miembros (propieades, métodos, y demás), los podemos encontrar en el siguiente link.

Indudablemente que la tarea de hacer backups, es básica en todo proyecto sobre todo cuando se esta haciendo pase de un ambiente de desarrollo, a uno de pruebas o uno producción. Lo que se me ocurre en este momento es una AppWindows parametrizable que te permita hacer un backup :D, si alguien la hace, o ya la tiene hecha, me avisa para linkearla. Si la hago antes, les aviso :).

Otras ejemplos con SMO:

Saludos,

Post cruzado

12 comentarios en “Restaurar base de datos SQL si no es a las buenas, a las malas, usando SMO :D”

  1. y como sería la opción inversa de matar el proceso? o sea, después de finalizar la restauración de esa base de datos, poder a volver a trabajar con ella.

    En mi caso me da problemas de Red.

    Saludos

Deja un comentario

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