管理スタジオでスタックしたタスク、それらをどのように処理しますか?


12

Management Studioで[データベースをオフラインにする]をクリックした後、このメッセージはハングしたままで、閉じるをクリックしても閉じません。

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

管理スタジオでこれらのようなスタックした仕事に対処する良い方法は何ですか?あなたは活動モニターを介してそれらを殺すことができますか?このジョブの通過を停止しているプロセスを探して終了する必要がありますか?


4
まず、それをブロックしているものを見つけます。この情報はsys.dm_exec_requestsから取得できます。また、あなたの仕事は、例えばALTER DATABASE foo SET SINGLE_USER WITH ROLLBACK IMMEDIATE;最初に発行することによって、ブロックされない方法でこれを行うことができます...さもなければそれはただ座って待機します、そして忙しいデータベースのために、それは永遠にありえます。
アーロンバートランド

データベースをsingle_userに設定することで問題は解決しました、推測したはずです... SQLserverは常にこの種のもののためにsingle_userを必要とします。
A_V 2016年

回答:


12

データベースが使用されていないという事実を知らない限り、GUIで「オフラインにする」ことは使用しないでください。なんでも。これは、いくつかのレッグワークを行わずに知るのは難しいので、このスクリプトをどこかに保存して、常にこれを使用してみませんか?

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

そしてもちろんその逆:

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

SINGLE_USER最初に設定する必要がある理由は、SQL Serverがデータベースに排他的にアクセスする必要があるため、既存のユーザーを削除するためです(オフラインダイアログではなく、デタッチダイアログで実行するオプションがあります)。それはオフラインです。とにかく、大規模なバックアップ操作またはETLジョブの途中でこれを実行する場合や、問題がある可能性がある場合と同様に、データベースを現在使用しているユーザーを確認するために追加のレッグワークを実行したい場合があります。

編集:私はこれについてConnectに提案を提出し(Connect#2687832を参照)、Trelloにも投稿しました(「オブジェクトエクスプローラー」に提出)。


また、データベースのロックを取得できないためにシングルユーザーの設定も失敗するとどうなりますか?
StackOverthrow

@ user560822データベースをロックできるようになるまで待つ必要があります。それがあなたがセッションを殺すことを始めなければならないことを意味するなら...
アーロン・バートランド

7

すでにハングアップしている状況にある場合は、サーバー全体で開いている接続を次のようにして検索できることを忘れないでください

sp_who2  

マスターなどの別のデータベース。
結果をスキャンして、オフラインにしようとしているデータベースを探します。
これらの行のspid(プロセスID)列の値に注意してください。

一度に1つずつ実行

kill  ##

ここで、「##」はspidです。

確かに、これらのプロセスを実行したままにすることが重要ではないことを確認してください。最新のコマンドを終了することもなく、警告もなく、プロセスは終了します。


1
受け入れられた答えは私のためのトリックをしませんでした。最初のコマンドで失敗しました。この答えは完璧に機能します。ありがとう
Cheburek

それは良いです:)はい、受け入れられた答えは本当に問題を回避するためのものです...すでにハングしている場合、それを殺すにはこのようなものが必要です
Mike M
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.