Tarea atrapada en el estudio de gestión, ¿cómo los maneja?

12

Después de hacer clic en "Desconectar la base de datos" en el estudio de administración, este mensaje permanece bloqueado y no se cerrará si hace clic en Cerrar.

https://i.imgur.com/KD6AROv.png

¿Cuál es una buena manera de lidiar con trabajos atascados como estos en el estudio de administración? ¿Puedes matarlos a través del monitor de actividad? ¿Debo buscar qué proceso está deteniendo este trabajo y terminarlo?

AV
fuente
44
Averigua qué lo bloquea, primero. Puede obtener esta información de sys.dm_exec_requests. Además, su trabajo puede hacer esto de una manera que no se bloquee, por ejemplo, emitiendo ALTER DATABASE foo SET SINGLE_USER WITH ROLLBACK IMMEDIATE;primero ... de lo contrario, simplemente se sienta y espera, y para una base de datos ocupada, eso podría ser para siempre.
Aaron Bertrand
Configurar la base de datos en usuario único resolvió el problema, debería haber adivinado ... SQLserver siempre requiere usuario único para este tipo de cosas.
A_V

Respuestas:

12

Yo diría que nunca use el elemento "Desconectar" en la GUI a menos que sepa con certeza que la base de datos no está en uso. Por cualquier cosa. Eso es difícil de saber sin hacer un poco de trabajo preliminar, así que ¿por qué no guardar este script en algún lugar y usarlo siempre?

USE [master];
GO
ALTER DATABASE $dbname$ SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
ALTER DATABASE $dbname$ SET OFFLINE;

Y luego el recíproco, por supuesto:

ALTER DATABASE $dbname$ SET ONLINE;
GO
ALTER DATABASE $dbname$ SET MULTI_USER;

La razón por la que debe configurarlo SINGLE_USERprimero es eliminar a los usuarios existentes (hay una opción para hacerlo en el diálogo de desconexión, pero no en el diálogo de desconexión), ya que SQL Server necesita acceso exclusivo a la base de datos para poder fuera de línea. Ahora, es posible que desee hacer un poco de trabajo de campo adicional de todos modos para ver quién está utilizando actualmente la base de datos, como si lo hiciera en medio de una operación de copia de seguridad grande o un trabajo ETL o lo que sea, eso podría ser problemático.

EDITAR : He presentado una sugerencia en Connect sobre esto (ver Connect # 2687832 ) y también lo he publicado en Trello (archivado en "Explorador de objetos").

Aaron Bertrand
fuente
¿Y si la configuración de un solo usuario también falla porque no puede obtener un bloqueo en la base de datos?
StackOverthrow
@ user560822 Tendrá que esperar hasta que pueda bloquear la base de datos. Si eso significa que tienes que comenzar a matar sesiones ...
Aaron Bertrand
7

Cuando ya esté en la situación de bloqueo, no olvide que puede buscar conexiones abiertas en todo el servidor con

sp_who2  

en otra base de datos, como master.
Escanee los resultados en busca de cualquier lugar donde la base de datos sea la que está intentando desconectar.
Tenga en cuenta el valor de columna spid (Id. De proceso) de esas filas.

Uno a la vez, corre

kill  ##

donde "##" es el spid.

Ciertamente tenga cuidado de asegurarse de que esos procesos no sean importantes para dejarlos en ejecución ... se terminarán sin siquiera terminar el último comando y sin previo aviso.

Mike M
fuente
1
La respuesta aceptada no me sirvió. Falló en el primer comando. Esta respuesta funciona perfectamente. Gracias
Cheburek
eso es bueno :) Sí, la respuesta aceptada es realmente para evitar el problema ... si ya estás colgado, necesitas algo como esto para matarlo
Mike M