Tâche bloquée dans le studio de gestion, comment les gérez-vous?

12

Après avoir cliqué sur "Mettre la base de données hors ligne" dans le studio de gestion, ce message reste bloqué et ne se ferme pas si vous cliquez sur Fermer.

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

Quelle est la bonne façon de gérer des emplois bloqués comme ceux-ci dans le studio de gestion? Pouvez-vous les tuer via le moniteur d'activité? Dois-je rechercher quel processus empêche ce travail de se terminer et y mettre fin?

UN V
la source
4
Découvrez d'abord ce qui le bloque. Vous pouvez obtenir ces informations à partir de sys.dm_exec_requests. De plus, votre travail peut le faire de manière à ce qu'il ne soit pas bloqué, par exemple en émettant d' ALTER DATABASE foo SET SINGLE_USER WITH ROLLBACK IMMEDIATE;abord ... sinon, il reste simplement en attente et, pour une base de données occupée, cela peut durer éternellement.
Aaron Bertrand
La définition de la base de données dans single_user a résolu le problème, j'aurais dû deviner ... SQLserver nécessite toujours single_user pour ce genre de choses.
A_V

Réponses:

13

Je dirais de ne jamais utiliser la fonction "Take Offline" dans l'interface graphique, sauf si vous savez avec certitude que la base de données n'est pas utilisée. Par n'importe quoi. C'est difficile à savoir sans faire quelques démarches, alors pourquoi ne pas enregistrer ce script quelque part et toujours l'utiliser?

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

Et puis l'inverse bien sûr:

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

La raison pour laquelle vous devez d'abord le définir SINGLE_USERest de supprimer tous les utilisateurs existants (il existe une option pour le faire dans la boîte de dialogue de détachement, mais pas la boîte de dialogue de mise hors ligne), car SQL Server a besoin d'un accès exclusif à la base de données pour prendre hors ligne. Maintenant, vous voudrez peut-être faire quelques travaux supplémentaires de toute façon pour voir qui utilise actuellement la base de données, comme si vous le faisiez au milieu d'une opération de sauvegarde importante ou d'un travail ETL ou quoi d'autre, cela pourrait être problématique.

EDIT : J'ai déposé une suggestion sur Connect à ce sujet (voir Connect # 2687832 ) et je l'ai également publiée sur Trello (classée sous "Object Explorer").

Aaron Bertrand
la source
Et que se passe-t-il si la définition d'un utilisateur unique échoue également car elle ne peut pas obtenir un verrou sur la base de données?
StackOverthrow
@ user560822 Vous devrez attendre de pouvoir verrouiller la base de données. Si cela signifie que vous devez commencer à tuer des sessions ...
Aaron Bertrand
8

Lorsque vous êtes déjà dans une situation de blocage, n'oubliez pas que vous pouvez rechercher des connexions ouvertes sur le serveur avec

sp_who2  

dans une autre base de données, comme master.
Analysez les résultats pour tout endroit où la base de données est celle que vous essayez de mettre hors ligne.
Notez la valeur de la colonne spid (process id) de ces lignes.

Un à la fois, exécutez

kill  ##

où "##" est le spid.

Assurez-vous certainement que ces processus ne sont pas importants pour rester en cours d'exécution ... ils seront arrêtés sans même terminer la dernière commande et sans avertissement.

Mike M
la source
1
La réponse acceptée n'a pas fait l'affaire pour moi. Échec lors de la première commande. Cette réponse fonctionne parfaitement. Merci
Cheburek
c'est bien :) Oui, la réponse acceptée est vraiment pour éviter le problème ... si vous êtes déjà accroché, vous avez besoin de quelque chose comme ça pour le tuer
Mike M