sql-server - usar - que significa compatibilidad de base de datos
¿Cómo se eliminan todas las conexiones actuales a una base de datos de SQL Server 2005? (19)
A continuación le indicamos cómo confiablemente este tipo de cosas en MS SQL Server Management Studio 2008 (también puede funcionar para otras versiones):
- En el Árbol del Explorador de objetos, haga clic con el botón derecho en el servidor de base de datos raíz (con la flecha verde) y luego haga clic en el monitor de actividad.
- Abra la pestaña de procesos en el monitor de actividad, seleccione el menú desplegable ''bases de datos'' y filtre por la base de datos que desee.
- Haga clic con el botón derecho en la base de datos en el Explorador de objetos e inicie una tarea ''Tareas -> Desconectar''. Deje esto corriendo en segundo plano mientras usted ...
- Apaga todo lo que puedas con seguridad.
- Elimine todos los procesos restantes de la pestaña de proceso.
- Vuelva a poner el DB en línea.
- Renombra el DB.
- Vuelva a poner su servicio en línea y apúntelo a la nueva base de datos.
Quiero cambiar el nombre de una base de datos, pero sigo recibiendo el error de que "no se pudo obtener el bloqueo exclusivo" en la base de datos, lo que implica que todavía hay algunas conexiones activas.
¿Cómo puedo eliminar todas las conexiones a la base de datos para poder cambiarle el nombre?
Consulte Eliminar todas las conexiones activas a una base de datos .
La razón por la que el enfoque que Adam sugirió no funcionará es que, durante el tiempo en que esté haciendo un bucle sobre las conexiones activas, se podrá establecer una nueva, y las perderá. El artículo al que he vinculado utiliza el siguiente enfoque 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
Desconectarse toma un tiempo y algunas veces tengo algunos problemas con eso.
La forma más sólida en mi opinión:
Separar Haga clic con el botón derecho en DB -> Tareas -> Separar ... marque "Eliminar conexiones" Aceptar
Vuelva a colocar el botón derecho Haga clic en Bases de datos -> Adjuntar .. Agregar ... -> seleccione su base de datos y cambie la columna Adjuntar al nombre de la base de datos que desee. De acuerdo
En MS SQL Server Management Studio en el explorador de objetos, haga clic derecho en la base de datos. En el menú contextual que sigue, seleccione ''Tareas -> Desconectar''
Esto no me funcionó (SQL2008 Enterprise), tampoco pude ver ningún proceso en ejecución o usuarios conectados a la base de datos. Reiniciar el servidor (haga clic con el botón derecho en Servidor SQL en Management Studio y seleccione Reiniciar) me permitió restaurar la base de datos.
Estoy usando SQL Server 2008 R2, mi base de datos ya estaba configurada para un solo usuario y había una conexión que restringía cualquier acción en la base de datos. Así, la solución SQLMenace''s recomendada respondió con error. Aquí hay uno que funcionó en mi caso .
Haga clic con el botón derecho en el nombre de la base de datos, haga clic en la ventana Propiedad para obtener la propiedad, abra la pestaña Opciones y cambie la propiedad "Restringir acceso" de multiusuario a usuario único. Cuando presiona el botón Aceptar, le pedirá que cierre todas las conexiones abiertas, seleccione "Sí" y que está configurado para cambiar el nombre de la base de datos ...
La opción que me funciona en este escenario es la siguiente:
- Inicie la operación "Separar" en la base de datos en cuestión. Esto abrirá una ventana (en SQL 2005) que muestra las conexiones activas que impiden acciones en la base de datos.
- Matar las conexiones activas, cancelar la operación de separación.
- La base de datos ahora debería estar disponible para la restauración.
Mátalo y mátalo 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
Normalmente me encuentro con ese error cuando intento restaurar una base de datos. Por lo general, solo voy a la parte superior del árbol en Management Studio y hago clic derecho y reinicio el servidor de la base de datos (debido a que está en una máquina de desarrollo, esto podría no ser ideal en producción). ). Esto es cerrar todas las conexiones de base de datos.
Otro enfoque de "eliminarlo con fuego" es simplemente reiniciar el servicio MSSQLSERVER. Me gusta hacer cosas desde la línea de comandos. Pegando esto exactamente en CMD lo hará: NET STOP MSSQLSERVER & NET START MSSQLSERVER
O abra "services.msc" y busque "SQL Server (MSSQLSERVER)" y haga clic derecho, seleccione "reiniciar".
Esto "de seguro, seguro" eliminará TODAS las conexiones a TODAS las bases de datos que se ejecutan en esa instancia.
(Me gusta esto mejor que muchos enfoques que cambian y cambian la configuración en el servidor / base de datos)
Prueba esto:
ALTER DATABASE [DATABASE_NAME]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE
Puede usar el comando SP_Who y eliminar todos los procesos que usen su base de datos y luego cambiar el nombre de su base de datos.
Script para lograr esto, reemplace ''DB_NAME'' con la base de datos para eliminar todas las conexiones a:
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
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
Utilizando SQL Management Studio Express:
En el árbol del Explorador de objetos, profundice en Administración a "Monitor de actividad" (si no puede encontrarlo allí, haga clic derecho en el servidor de la base de datos y seleccione "Monitor de actividad"). Al abrir el Monitor de actividad, puede ver toda la información del proceso. Debería poder encontrar los bloqueos para la base de datos que le interesa y eliminar esos bloqueos, lo que también anulará la conexión.
Deberías poder renombrar después de eso.
Yo uso sp_who para obtener una lista de todos los procesos en la base de datos. Esto es mejor porque es posible que desee revisar qué proceso 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 usar el comando en la columna KillCommand para finalizar el proceso que desea.
SPID KillCommand
26 kill 26;
27 kill 27;
28 kill 28;
ALTER DATABASE [Test]
SET OFFLINE WITH ROLLBACK IMMEDIATE
ALTER DATABASE [Test]
SET ONLINE
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
use la base de datos ''maestra'' y ejecute esta consulta, eliminará todas las conexiones activas de su base de datos.