¿Cómo se puede matar a todas las conexiones a un Servidor SQL server 2005 de la base de datos?

StackOverflow https://stackoverflow.com/questions/11620

  •  08-06-2019
  •  | 
  •  

Pregunta

Quiero cambiar el nombre de una base de datos, pero sigue apareciendo el error de que "no podía conseguir bloqueo exclusivo' en la base de datos, lo que implica que hay algún tipo de conexión(s) activo.

¿Cómo puedo matar a todas las conexiones a la base de datos para que yo pueda cambiarle el nombre?

¿Fue útil?

Solución

Ver Matar A Todas Las Conexiones Activas De Una Base De Datos.

La razón por la que el enfoque que Adam sugerido no funciona es que durante el tiempo que usted es un bucle por las conexiones activas de uno nuevo puede ser establecida, y vas a perder los.El artículo que he enlazado a utiliza la siguiente aproximación que no tiene este inconveniente:

-- set your current connection to use master otherwise you might get an error

use master
ALTER DATABASE YourDatabase SET SINGLE_USER WITH ROLLBACK IMMEDIATE 

--do you stuff here 

ALTER DATABASE YourDatabase SET MULTI_USER

Otros consejos

Script para lograr esto, reemplace 'DB_NAME' con la base de datos para eliminar todas las conexiones para:

USE master
GO

SET NOCOUNT ON
DECLARE @DBName varchar(50)
DECLARE @spidstr varchar(8000)
DECLARE @ConnKilled smallint
SET @ConnKilled=0
SET @spidstr = ''

Set @DBName = 'DB_NAME'
IF db_id(@DBName) < 4
BEGIN
PRINT 'Connections to system databases cannot be killed'
RETURN
END
SELECT @spidstr=coalesce(@spidstr,',' )+'kill '+convert(varchar, spid)+ '; '
FROM master..sysprocesses WHERE dbid=db_id(@DBName)

IF LEN(@spidstr) > 0
BEGIN
EXEC(@spidstr)
SELECT @ConnKilled = COUNT(1)
FROM master..sysprocesses WHERE dbid=db_id(@DBName)
END

Matar, y matar con fuego:

USE master
go

DECLARE @dbname sysname
SET @dbname = 'yourdbname'

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

Con SQL Management Studio Express:

En el árbol del Explorador de Objetos de perforación hacia abajo, bajo la Administración de "Monitor de Actividad" (si usted no puede encontrar a continuación, haga clic en el servidor de base de datos y seleccione "Monitor de Actividad").Abrir el Monitor de Actividad, puede ver toda la información del proceso.Usted debe ser capaz de encontrar los bloqueos de la base de datos que le interesa y matar a los bloqueos, que también matará a la conexión.

Usted debe ser capaz de cambiar de nombre después de que.

Yo siempre he usado:


ALTER DATABASE DB_NAME SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
GO 
SP_RENAMEDB 'DB_NAME','DB_NAME_NEW'
Go 
ALTER DATABASE DB_NAME_NEW  SET MULTI_USER -- set back to multi user 
GO 
ALTER DATABASE [Test]
SET OFFLINE WITH ROLLBACK IMMEDIATE

ALTER DATABASE [Test]
SET ONLINE

Desconectar toma tiempo y a veces tengo la experiencia de algunos de los problemas..

La mayoría de manera sólida en mi opinión:

Separar Haga clic derecho DB -> Tareas -> Separar...marque "Soltar las Conexiones" Ok

Vuelva a colocar Haga clic en Bases de datos -> Attach..Añadir...-> seleccione la base de datos, y cambiar el Adjuntar Como la columna que desee nombre de base de datos.Ok

Select 'Kill '+ CAST(p.spid AS VARCHAR)KillCommand into #temp
from master.dbo.sysprocesses p (nolock)
join master..sysdatabases d (nolock) on p.dbid = d.dbid
Where d.[name] = 'your db name'

Declare @query nvarchar(max)
--Select * from #temp
Select @query =STUFF((                              
            select '  ' + KillCommand from #temp
            FOR XML PATH('')),1,1,'') 
Execute sp_executesql @query 
Drop table #temp

utilice el "master" de la base de datos y ejecutar esta consulta, va a matar a todas las conexiones activas de su base de datos.

Yo suelo correr en ese error cuando estoy tratando de restaurar una base de datos por lo general basta con ir a la parte superior del árbol en Management Studio y haga clic derecho y reinicie el servidor de base de datos (ya sea en una máquina de desarrollo, esto podría no ser ideal en la producción).Este es cerrar todas las conexiones de base de datos.

En MS SQL Server Management Studio en el explorador de objetos, haga clic derecho en la base de datos.En el menú de contexto que sigue seleccione 'tasks -> desconectar'

Otro "matar con fuego" es sólo reiniciar el servicio MSSQLSERVER.Me gusta hacer cosas desde la línea de comandos.Pegar esta exactamente en CMD hará:NET STOP MSSQLSERVER & NET START MSSQLSERVER

O abra "de servicios.msc" y encontrar "SQL Server (MSSQLSERVER)" y haga clic derecho, seleccione "reiniciar".

Esto "seguro, seguro" eliminar TODAS las conexiones a TODAS las bases de datos que se ejecutan en esa instancia.

(Me gusta esta mejor que muchos de los enfoques que cambiar y volver a cambiar la configuración en el servidor/base de datos)

He aquí cómo de forma fiable este tipo de cosas en MS SQL Server Management Studio 2008 (puede funcionar para otras versiones):

  1. En el Árbol del Explorador de Objetos, haga clic en la raíz del servidor de base de datos (con la flecha verde), a continuación, haga clic en monitor de actividad.
  2. Abra la ficha procesos en el monitor de actividad, seleccione la opción "bases de datos" en el menú desplegable de filtro y la base de datos que desee.
  3. Haga clic en la base de datos en el Explorador de Objetos y comenzar una 'Tareas -> desconectar' de la tarea.Salir de esta ejecutando en segundo plano mientras usted...
  4. Apague de manera segura todo lo que puede.
  5. Matar a todos los procesos restantes de la ficha de proceso.
  6. Traer a la base de datos en línea.
  7. Cambiar el nombre de la DB.
  8. Traiga su servicio en línea y hacer que apunte a la base de datos nueva.

La opción de trabajo para mí en este escenario es el siguiente:

  1. Inicio de la "Desconectar" de la operación en la base de datos en cuestión.Este factor abrir una ventana (en SQL 2005) que muestra las conexiones activas que impide que las acciones sobre la base de datos.
  2. Matar a las conexiones activas, cancelar la de separar la operación.
  3. La base de datos debe estar disponible para su restauración.

Intente esto:

ALTER DATABASE [DATABASE_NAME]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE

Haga clic derecho en el nombre de base de datos, haga clic en la Propiedad para obtener la ventana de propiedades, Abra la ficha Opciones y cambiar el "Restringir el Acceso" de propiedad de Multi-Usuario a Usuario Único.Cuando se pulse el botón ACEPTAR, se le pedirá que cierra todas las conexión, seleccione "Sí" y que van a cambiar el nombre de la base de datos....

Estos no funcionó para mí (SQL2008 de la Empresa), yo también no podía ver ninguna de ejecución de los procesos o usuarios conectados a la base de datos.Reiniciar el servidor (a la Derecha haga clic en Sql Server Management Studio y elija Reiniciar) me permitió restaurar la base de datos.

Estoy usando SQL Server 2008 R2, mi DB, ya para un solo usuario y no había una conexión que restringe cualquier tipo de acción sobre la base de datos.Así, el recomendado SQLMenace del solución respondió con error. Aquí hay uno que trabajó en mi caso.

Yo uso sp_who para obtener la lista de todos los procesos en la base de datos.Esto es mejor porque es posible que desee revisar que el proceso de matar.

declare @proc table(
    SPID bigint,
    Status nvarchar(255),
    Login nvarchar(255),
    HostName nvarchar(255),
    BlkBy nvarchar(255),
    DBName nvarchar(255),
    Command nvarchar(MAX),
    CPUTime bigint,
    DiskIO bigint,
    LastBatch nvarchar(255),
    ProgramName nvarchar(255),
    SPID2 bigint,
    REQUESTID bigint
)

insert into @proc
exec sp_who2

select  *, KillCommand = concat('kill ', SPID, ';')
from    @proc

Resultado
Puede utilizar el comando en KillCommand columna para matar el proceso que se desea.

SPID    KillCommand
26      kill 26;
27      kill 27;
28      kill 28;

Puede Utilizar el comando de SP_Who y matar a todos los procesos que usar la base de datos y, a continuación, cambiar el nombre de tu base de datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top