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
Published 28/7/2007 23:15 por Sergio Tarrillo
Comparte este post:
http://geeks.ms/blogs/sergiotarrillo/archive/2007/07/28/23933.aspx

Comentarios

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

ta q monse.....este articulo...

Thursday, October 11, 2007 6:44 PM por Patrick

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

gracias Patrick!

Saludos,

Saturday, January 26, 2008 12:52 AM por Sergio Tarrillo

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

gracias, me funciono

Friday, June 6, 2008 11:32 PM por peter

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

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

Wednesday, July 2, 2008 6:40 PM por yo

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

Gracias!!! Hasta las 3 de la mañana estuve ayer con eso! Muchas gracias nuevamente

Saturday, July 11, 2009 7:07 PM por Hernan

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

codigo fuente en visual basic.net para restaurar base de datos sql server: sites.google.com/.../fuentesoftware

Tuesday, November 10, 2009 2:57 PM por franczorh

# Pablo Viale &raquo; Blog Archive &raquo; Exclusive access could not be obtained because the database is in use

PingBack desde  Pablo Viale  » Blog Archive   » Exclusive access could not be obtained because the database is in use

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

gracias me has ayudado muchisimo he pasado dias viendo como solucionaba esto pero gracias a tu codigo solucione mi proble mil gracias!!!!!!!!!!

Monday, November 29, 2010 5:28 AM por javiwendy

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

Gracias a me has sacado de un hueco.Gracias

Monday, January 3, 2011 9:34 PM por Ricar2Arias

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

gracias me funciono !!!!

Tuesday, August 9, 2011 4:43 PM por Jaime Paez

# Exclusive access could not be obtained because the database is in use | viale.mx

PingBack desde  Exclusive access could not be obtained because the database is in use | viale.mx

# Exclusive access could not be obtained because the database is in use | Pablo Viale

PingBack desde  Exclusive access could not be obtained because the database is in use | Pablo Viale