Festgefahrene Aufgabe im Managementstudio, wie gehen Sie damit um?

12

Nachdem Sie im Management Studio auf "Datenbank offline schalten" geklickt haben, bleibt diese Nachricht hängen und wird nicht geschlossen, wenn Sie auf "Schließen" klicken.

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

Was ist ein guter Weg, um mit solchen festgefahrenen Jobs im Managementstudio umzugehen? Können Sie sie über den Aktivitätsmonitor töten? Sollte ich suchen, durch welchen Prozess dieser Job nicht mehr ausgeführt werden kann, und ihn beenden?

EIN V
quelle
4
Finden Sie zuerst heraus, was es blockiert. Sie können diese Informationen von sys.dm_exec_requests erhalten. Ihr Job kann dies auch so tun, dass er nicht blockiert wird, z. B. indem er ALTER DATABASE foo SET SINGLE_USER WITH ROLLBACK IMMEDIATE;zuerst ausgegeben wird. Andernfalls sitzt er nur und wartet, und für eine ausgelastete Datenbank könnte dies für immer sein.
Aaron Bertrand
Das Einstellen der Datenbank in single_user hat das Problem behoben, ich hätte raten sollen ... SQLserver benötigt immer single_user für diese Art von Dingen.
A_V

Antworten:

12

Ich würde sagen, verwenden Sie niemals das Ding "Offline nehmen" in der GUI, es sei denn, Sie wissen, dass die Datenbank nicht verwendet wird. Durch irgendetwas. Das ist schwer zu wissen, ohne etwas Beinarbeit zu leisten. Warum also nicht dieses Skript irgendwo speichern und immer verwenden?

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

Und dann natürlich das Gegenteil:

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

Der Grund, warum Sie es SINGLE_USERzuerst festlegen müssen, besteht darin, vorhandene Benutzer auszuschalten (es gibt eine Option, dies im Dialogfeld "Trennen" zu tun, nicht jedoch im Dialogfeld "Offline nehmen"), da SQL Server exklusiven Zugriff auf die Datenbank benötigt es offline. Jetzt möchten Sie vielleicht trotzdem zusätzliche Arbeit leisten, um zu sehen, wer die Datenbank derzeit verwendet, als ob Sie dies mitten in einem großen Sicherungsvorgang oder einem ETL-Job tun oder was Sie haben, das könnte problematisch sein.

BEARBEITEN : Ich habe einen Vorschlag zu Connect eingereicht (siehe Connect # 2687832 ) und ihn auch an Trello gesendet (abgelegt unter "Objekt-Explorer").

Aaron Bertrand
quelle
7

Wenn Sie sich bereits in einer hängenden Situation befinden, vergessen Sie nicht, dass Sie mit nach offenen Verbindungen auf dem Server suchen können

sp_who2  

in einer anderen Datenbank, z. B. master.
Scannen Sie die Ergebnisse nach Daten, bei denen es sich um die Datenbank handelt, die Sie offline schalten möchten.
Beachten Sie den Spaltenwert spid (Prozess-ID) dieser Zeilen.

Lauf nacheinander

kill  ##

Dabei ist "##" die Spid.

Stellen Sie sicher, dass diese Prozesse nicht wichtig sind, damit sie ausgeführt werden. Sie werden beendet, ohne den letzten Befehl zu beenden und ohne Vorwarnung.

Mike M.
quelle
1
Die akzeptierte Antwort hat mir nicht geholfen. Fehler beim ersten Befehl. Diese Antwort funktioniert perfekt. Vielen Dank
Cheburek
das ist gut :) Ja, die akzeptierte Antwort ist wirklich, um das Problem zu vermeiden ... wenn Sie bereits aufgehängt sind, brauchen Sie so etwas, um es zu töten
Mike M