Mi SQL Server 2005 no restaura una copia de seguridad debido a conexiones activas. ¿Cómo puedo forzarlo?
Mi SQL Server 2005 no restaura una copia de seguridad debido a conexiones activas. ¿Cómo puedo forzarlo?
Respuestas:
Cuando hace clic derecho en una base de datos y hace clic Tasks
y luego hace clic Detach Database
, aparece un cuadro de diálogo con las conexiones activas.
Al hacer clic en el hipervínculo debajo de "Mensajes" puede eliminar las conexiones activas.
Luego puede eliminar esas conexiones sin separar la base de datos.
Más información aquí .
La interfaz ha cambiado para SQL Server Management Studio 2008, estos son los pasos (a través de: Tim Leung )
Desea configurar su base de datos en modo de usuario único, realice la restauración y luego vuelva a configurarla en multiusuario:
ALTER DATABASE YourDB
SET SINGLE_USER WITH
ROLLBACK AFTER 60 --this will give your current connections 60 seconds to complete
--Do Actual Restore
RESTORE DATABASE YourDB
FROM DISK = 'D:\BackUp\YourBaackUpFile.bak'
WITH MOVE 'YourMDFLogicalName' TO 'D:\Data\YourMDFFile.mdf',
MOVE 'YourLDFLogicalName' TO 'D:\Data\YourLDFFile.ldf'
/*If there is no error in statement before database will be in multiuser
mode. If error occurs please execute following command it will convert
database in multi user.*/
ALTER DATABASE YourDB SET MULTI_USER
GO
Referencia: Pinal Dave ( http://blog.SQLAuthority.com )
Referencia oficial: https://msdn.microsoft.com/en-us/library/ms345598.aspx
ROLLBACK IMMEDIATE
o ROLLBACK AFTER 60
. La única forma de guardar esos datos es realizar otra copia de seguridad después de la reversión. Pero está restaurando desde una copia de seguridad diferente. Entonces, ¿qué sentido tiene esperar? ¿Me estoy perdiendo de algo?
Este código funcionó para mí, mata todas las conexiones existentes de una base de datos. Todo lo que tiene que hacer es cambiar la línea Set @dbname = 'databaseName' para que tenga el nombre de su base de datos.
Use Master
Go
Declare @dbname sysname
Set @dbname = 'databaseName'
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
después de esto pude restaurarlo
Prueba esto:
DECLARE UserCursor CURSOR LOCAL FAST_FORWARD FOR
SELECT
spid
FROM
master.dbo.sysprocesses
WHERE DB_NAME(dbid) = 'dbname'--replace the dbname with your database
DECLARE @spid SMALLINT
DECLARE @SQLCommand VARCHAR(300)
OPEN UserCursor
FETCH NEXT FROM UserCursor INTO
@spid
WHILE @@FETCH_STATUS = 0
BEGIN
SET @SQLCommand = 'KILL ' + CAST(@spid AS VARCHAR)
EXECUTE(@SQLCommand)
FETCH NEXT FROM UserCursor INTO
@spid
END
CLOSE UserCursor
DEALLOCATE UserCursor
GO
Reiniciar el servidor SQL desconectará a los usuarios. La forma más fácil que he encontrado, también es bueno si quieres desconectar el servidor.
Pero por alguna extraña razón, la opción 'Desconectar' no lo hace de manera confiable y puede colgar o confundir la consola de administración. Reiniciar y luego desconectar trabajos
A veces, esta es una opción, si, por ejemplo, ha detenido un servidor web que es la fuente de las conexiones.
Me encontré con este problema mientras automatizaba un proceso de restauración en SQL Server 2008. Mi enfoque (exitoso) fue una combinación de dos de las respuestas proporcionadas.
Primero, me encuentro con todas las conexiones de dicha base de datos y las elimino.
DECLARE @SPID int = (SELECT TOP 1 SPID FROM sys.sysprocess WHERE dbid = db_id('dbName'))
While @spid Is Not Null
Begin
Execute ('Kill ' + @spid)
Select @spid = top 1 spid from master.dbo.sysprocesses
where dbid = db_id('dbName')
End
Luego, configuro la base de datos en modo de usuario único
ALTER DATABASE dbName SET SINGLE_USER
Entonces, ejecuto la restauración ...
RESTORE DATABASE and whatnot
Mata las conexiones de nuevo
(same query as above)
Y vuelva a configurar la base de datos en multi_user.
ALTER DATABASE dbName SET MULTI_USER
De esta manera, me aseguro de que no haya conexiones que detengan la base de datos antes de configurarla en modo único, ya que la primera se congelará si la hay.
Ninguno de estos funcionaba para mí, no podía eliminar ni desconectar a los usuarios actuales. Tampoco pude ver ninguna conexión activa a la base de datos. Reiniciar SQL Server (haga clic derecho y seleccione Reiniciar) me permitió hacerlo.
Para agregar a los consejos ya dados, si tiene una aplicación web que se ejecuta a través de IIS que usa la base de datos, es posible que también deba detener (no reciclar) el grupo de aplicaciones para la aplicación mientras restaura, luego reinicie. La detención del grupo de aplicaciones elimina las conexiones http activas y no permite más, lo que de otro modo podría terminar permitiendo que se activen procesos que se conectan y, por lo tanto, bloquean la base de datos. Este es un problema conocido, por ejemplo, con el sistema de gestión de contenido Umbraco al restaurar su base de datos
Nada de lo anterior funcionó para mí. Mi base de datos no mostró ninguna conexión activa usando Activity Monitor o sp_who. Finalmente tuve que:
No es la solución más elegante, pero funciona y no requiere reiniciar SQL Server (no es una opción para mí, ya que el servidor DB alojó un montón de otras bases de datos)
Prefiero hacer así
alterar la base de datos establecida sin conexión con reversión inmediata
y luego restaure su base de datos. después de esto,
alterar la base de datos establecida en línea con reversión inmediata