web-dev-qa-db-fra.com

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

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 fermera pas si vous cliquez sur Fermer.

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

Quel est un bon moyen 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?

13
A_V

Je dirais de ne jamais utiliser la fonction "Take Offline" dans l'interface graphique à moins que vous ne sachiez 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 le définir sur SINGLE_USER la première consiste à 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 la mettre hors ligne. Maintenant, vous voudrez peut-être faire un travail supplémentaire 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 que ce soit, cela pourrait être problématique.

[~ # ~] modifier [~ # ~] : J'ai déposé une suggestion sur Connect à ce sujet (voir Connect # 2687832 =) et l'ont également posté sur Trello (classé sous "Object Explorer").

13
Aaron Bertrand

Lorsque vous êtes déjà dans une situation suspendue, 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 tous ceux où la base de données est celle que vous essayez de mettre hors ligne.
Notez la valeur de la colonne spid (id du processus) de ces lignes.

Un à la fois, exécutez

kill  ##

où "##" est le spid.

Veillez certainement à ce que ces processus ne soient 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.

9
Mike M