sql-server - seguridad - restaurar base de datos sql server query
Al restaurar una copia de seguridad, ¿cómo desconecto todas las conexiones activas? (9)
SQL Server Management Studio 2005
Cuando hace clic derecho en una base de datos y hace clic en Tasks
y luego en Detach Database
, aparece un cuadro de diálogo con las conexiones activas.
Separar pantalla http://www.kodyaz.com/images/articles/kill-all-processes/detach-database.JPG
Al hacer clic en el hipervínculo en "Mensajes" puede eliminar las conexiones activas.
A continuación, puede eliminar esas conexiones sin separar la base de datos.
Más información here .
SQL Server Management Studio 2008
La interfaz ha cambiado para SQL Server Management studio 2008, aquí están los pasos (a través de: Tim Leung )
- Haga clic con el botón derecho en el servidor en el Explorador de objetos y seleccione ''Monitor de actividad''.
- Cuando esto se abra, expanda el grupo Procesos.
- Ahora usa el menú desplegable para filtrar los resultados por nombre de base de datos.
- Elimine las conexiones del servidor seleccionando la opción de ''Hacer clic en el proceso''.
Mi SQL Server 2005 no restaura una copia de seguridad debido a las conexiones activas. ¿Cómo puedo forzarlo?
Desea establecer su base de datos en el modo de usuario único, realice la restauración y luego configúrelo de nuevo 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
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 Establezca @dbname = ''databaseName'' para que tenga su nombre de 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
Me encontré con este problema al automatizar un proceso de restauración en SQL Server 2008. Mi (exitoso) enfoque fue una combinación de dos de las respuestas proporcionadas.
Primero, me encuentro con todas las conexiones de dicha base de datos y las mato.
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, configuré la base de datos en un modo de usuario único
ALTER DATABASE dbName SET SINGLE_USER
Luego, ejecuto la restauración ...
RESTORE DATABASE and whatnot
Mata a las conexiones de nuevo
(same query as above)
Y configure la base de datos a multi_user.
ALTER DATABASE dbName SET MULTI_USER
De esta manera, me aseguro de que no haya conexiones que contengan la base de datos antes de establecer en modo único, ya que la primera se congelará si las hay.
Ninguno de estos funcionaba para mí, no podía eliminar o desconectar usuarios actuales. Tampoco pude ver ninguna conexión activa a la base de datos. Reiniciar SQL Server (clic derecho y seleccionar Reiniciar) me permitió hacerlo.
Ninguno de los anteriores funcionó para mí. Mi base de datos no mostró ninguna conexión activa usando Activity Monitor o sp_who. Finalmente tuve que:
- Haga clic derecho en el nodo de base de datos
- Seleccione "Separar ..."
- Marque la casilla "Soltar conexiones"
- Volver a unir
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 de bases de datos alojó un montón de otras bases de datos)
Para agregar a los consejos ya dados, si tiene una aplicación web ejecutándose a través de IIS que usa la base de datos, también puede necesitar detener (no reciclar) el grupo de aplicaciones para la aplicación mientras restaura y luego reinicia. Detener el grupo de aplicaciones elimina las conexiones http activas y no permite más, lo que de otro modo podría terminar permitiendo que se desencadenen procesos que se conectan y bloquean la base de datos. Este es un problema conocido, por ejemplo, con Umbraco Content Management System al restaurar su base de datos
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 buena si quieres desconectar el servidor.
Pero por alguna razón muy extraña, la opción ''Desconectar'' no hace esto de manera confiable y puede colgar o confundir la consola de administración. Reiniciar y luego realizar trabajos fuera de línea
Algunas veces esta es una opción, por ejemplo, detener un servidor web que es el origen de las conexiones.