2009-02-08 14 views
9

Estoy tratando de eliminar una base de datos existente en SQL Server 2005. Mi primer intento produce el siguiente error:Cómo eliminar la base de datos, la base de datos de error 5030 no se puede bloquear

5030: The database could not be exclusively locked to perform the operation.

ya que he matado a todos los procesos que están accediendo a la base de datos. También eliminé la suscripción de replicación en la que había participado anteriormente.

¿Alguna idea de qué otra cosa podría estar bloqueándola además de los procesos y la replicación de SQL Server?

Actualización: reinicié el servidor, y eso lo solucionó. Estaba tratando de evitar eso, ya que este es un servidor de producción, pero ¿qué puedes hacer?

Respuesta

6

Odio decirlo, pero una solución rápida es reiniciar el sistema, asegúrese de que el servicio del servidor del servidor sql no se inicie, entonces debería poder eliminar.

Además, ¿se detiene IIS si db está conectado a una aplicación web?

+0

Nada como IIS está accediendo a este DB, y cuando miro la lista de procesos, no veo nada en absoluto usándolo. Puede estar en lo cierto al reiniciar el servidor. Es un sistema de producción con otras bases de datos, así que odio hacerlo, pero podría ser necesario. – jeremcc

+1

Pensé que se trataba de una caja de producción, por lo que no quería recomendar el reinicio, pero esa es una forma segura de cerrar todas las conexiones activas. Si pudieras publicar todos los procesos que se ejecutan en la caja, uno podría saltar como el culpable –

1

Nadie más debe utilizar la base de datos, incluido usted mismo.

+0

No, nadie lo está. Solo estoy tratando de eliminarlo. – jeremcc

2

En el estudio de administración, goto Management-> Activity Monitor (haga clic con el botón derecho) -> View Processes. Eso le dará una lista completa de todo lo que se está ejecutando, puede ordenar la lista por la Base de datos para ver qué está todavía adjunta y también puede eliminar todas las conexiones. Es fácil terminar con conexiones huérfanas que le impedirán obtener el acceso exclusivo que necesita.

+0

Sí, hice todo eso. No hay procesos que accedan a él, y aún no se puede bloquearlo. – jeremcc

+0

¿Necesita configurar el DB en modo de usuario único? Aun así, si no puede verlo en Activity Monitor, me inclino a aceptar que un reinicio del servidor Sql resolverá el problema. – MrTelly

3

¿No sabe si alguien dejó una transacción en un estado de retrotracción incompleto (o no completado)? También podría verificar la lista de bloqueos.

+0

No hay nada en la lista actualmente. Pero ya sabes, * había * una gran cantidad de bloqueos transaccionales en esta base de datos, y los maté manualmente a todos, no hace mucho tiempo. Todavía podría estar en algún tipo de estado de reversión de eso. Tal vez solo necesito esperar. Hmm ... – jeremcc

+0

Muy, muy probable. – dkretz

12

¿Un servidor de producción en el que tantas conexiones usan la base de datos pero quiere soltarlo? :)

No obstante, la forma de echar a todo el mundo de la base de datos:

USE [dbname]; 
ALTER DATABASE [dbname] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; 

a continuación, colocar la base de datos:

USE [master]; 
DROP DATABASE [dbname]; 

Todavía hay una muy pequeña ventana de oportunidad entre el USE [master]; y DROP DATABASE ... donde alguna otra conexión puede capturar el 1 único bloqueo permitido en la base de datos, pero por lo general no vale la pena trabajar en eso.

+0

Agradable y específico, gracias. – jeremcc

+0

¿Cómo se invierte 'ALTER DATBASE [dbname] SET SINGLE_USER WITH ROLLBACK IMMEDIATE'? –

+3

@Mike C: si lo sueltas, entonces no hay necesidad de retroceder, ¿verdad? Si preguntas en un contexto más general y no quieres DROP, como el OP, entonces emite 'ALTER DATABASE [nombre_bd] SET MULTI_USER;' –

0

Este error normalmente ocurre cuando su base de datos se encuentra en modo de usuario múltiple donde los usuarios acceden a su base de datos o algunos objetos hacen referencia a su base de datos. En primer lugar debe configurar la base de datos en modo monousuario:

ALTER DATABASE dbName 
SET SINGLE_USER WITH ROLLBACK IMMEDIATE 

Ahora vamos a tratar de eliminar la base de datos

delete DATABASE ... 

fije en definitiva la base de datos en modo multiusuario

ALTER DATABASE dbName 
SET MULTI_USER WITH ROLLBACK IMMEDIATE 
0

¿Por qué hacemos una base de datos borrada en el modo multiusuario.

ALTER DATABASE dbName SET MULTI_USER WITH ROLLBACK IMMEDIATE 
0

Para evitar este error, utilice el siguiente script T-SQL en la base de datos maestra. Asegúrese de que para ejecutar este (y modificar la @dbname) para cada base de datos que está ejecutando el comando ALTER DATABASE en.

"The database could not be exclusively locked to perform the operation"

Este script "conexión asesino" funcionará si Windows ha establecido conexiones JDBC a la base de datos. Pero este script no puede eliminar las conexiones JDBC para los servicios de Linux (por ejemplo, JBoss). Por lo tanto, seguirá recibiendo ese error si no detiene manualmente JBoss. No he probado otros protocolos, pero por favor coméntelos si encuentra más información a medida que construye nuevos sistemas.

USE master; 

DECLARE @dbname sysname 

Set @dbname = 'DATABASE_NAME_HERE-PROD' 

Declare @spid int 
Select @spid = min(spid) from master.dbo.sysprocesses 
where dbid = db_id(@dbname) 
While @spid Is Not Null 
Begin 
     Execute ('Kill ' + @spid) 
     Select @spid = min(spid) from master.dbo.sysprocesses 
     where dbid = db_id(@dbname) and spid > @spid 
End 
Cuestiones relacionadas