web-dev-qa-db-ja.com

バックアップを復元するときに、アクティブな接続をすべて切断するにはどうすればよいですか?

SQL Server 2005は、アクティブな接続が原因でバックアップを復元しません。どうすれば強制できますか?

164
Jader Dias

SQL Server Management Studio 2005

データベースを右クリックしてTasksをクリックし、Detach Databaseをクリックすると、アクティブな接続を示すダイアログが表示されます。

Detach Screen

「メッセージ」の下のハイパーリンクをクリックすると、アクティブな接続を強制終了できます。

その後、データベースをデタッチせずにそれらの接続を強制終了できます。

詳細情報 こちら

SQL Server Management Studio 2008

SQL Server Management Studio 2008のインターフェイスが変更されました。手順は次のとおりです(経由: Tim Leung

  1. オブジェクトエクスプローラーでサーバーを右クリックし、[アクティビティモニター]を選択します。
  2. これが開いたら、[プロセス]グループを展開します。
  3. 次に、ドロップダウンを使用して、データベース名で結果をフィルタリングします。
  4. 「Kill​​ Process」オプションを右クリックして選択し、サーバー接続を終了します。
172
George Stocker

データベースをシングルユーザーモードに設定し、復元を実行してから、マルチユーザーに戻します。

ALTER DATABASE YourDB
SET SINGLE_USER WITH
ROLLBACK AFTER 60 --this will give your current connections 60 seconds to complete

--Do Actual Restore
RESTORE DATABASE YourDB
FROM DISK = 'D:\BackUp\YourBaackUpFile.bak'
WITH MOVE 'YourMDFLogicalName' TO 'D:\Data\YourMDFFile.mdf',
MOVE 'YourLDFLogicalName' TO 'D:\Data\YourLDFFile.ldf'

/*If there is no error in statement before database will be in multiuser
mode.  If error occurs please execute following command it will convert
database in multi user.*/
ALTER DATABASE YourDB SET MULTI_USER
GO

参照:Pinal Dave( http://blog.SQLAuthority.com

公式リファレンス: https://msdn.Microsoft.com/en-us/library/ms345598.aspx

186
brendan

このコードは私のために働いた、それはデータベースのすべての既存の接続を殺します。必要なのは、Set @dbname = 'databaseName'という行を変更して、データベース名を設定することだけです。

Use Master
Go

Declare @dbname sysname

Set @dbname = 'databaseName'

Declare @spid int
Select @spid = min(spid) from master.dbo.sysprocesses
where dbid = db_id(@dbname)
While @spid Is Not Null
Begin
        Execute ('Kill ' + @spid)
        Select @spid = min(spid) from master.dbo.sysprocesses
        where dbid = db_id(@dbname) and spid > @spid
End

この後、私はそれを復元することができました

38
RagnaRock

SQLサーバーを再起動すると、ユーザーが切断されます。私が見つけた最も簡単な方法-サーバーをオフラインにしたい場合にも良い。

しかし、いくつかの非常に奇妙な理由により、「オフラインにする」オプションはこれを確実に実行せず、管理コンソールをハングまたは混乱させる可能性があります。再起動してからオフラインで作業する

これはオプションの場合もあります-たとえば、接続のソースであるWebサーバーを停止した場合。

5
Simon_Weaver

これを試して ...

DECLARE UserCursor CURSOR LOCAL FAST_FORWARD FOR
SELECT
    spid
FROM
    master.dbo.sysprocesses
WHERE DB_NAME(dbid) = 'dbname'--replace the dbname with your database
DECLARE @spid SMALLINT
DECLARE @SQLCommand VARCHAR(300)
OPEN UserCursor
FETCH NEXT FROM UserCursor INTO
    @spid
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @SQLCommand = 'KILL ' + CAST(@spid AS VARCHAR)
    EXECUTE(@SQLCommand)
    FETCH NEXT FROM UserCursor INTO
        @spid
END
CLOSE UserCursor
DEALLOCATE UserCursor
GO
4
user2276214

既に与えられたアドバイスに追加するために、DBを使用するIISを介して実行しているWebアプリがある場合、アプリのアプリプールをstop(リサイクルしない)にする必要があるかもしれません復元中に再起動します。アプリプールを停止すると、アクティブなhttp接続が強制終了され、それ以上許可されなくなります。これは、データベースを復元するときのUmbracoコンテンツ管理システムなどの既知の問題です

2
Chris Halcrow

これらのどれも私のために働いていませんでした、現在のユーザーを削除したり、切断したりできませんでした。また、DBへのアクティブな接続を確認できませんでした。 SQL Serverを再起動(右クリックして[再起動]を選択)すると、実行できました。

2
The Coder

SQL Server 2008で復元プロセスを自動化中にこの問題に出くわしました。私の(成功した)アプローチは、提供された2つの答えの組み合わせでした。

まず、上記のデータベースのすべての接続を実行し、それらを強制終了します。

DECLARE @SPID int = (SELECT TOP 1 SPID FROM sys.sysprocess WHERE dbid = db_id('dbName'))
While @spid Is Not Null
Begin
        Execute ('Kill ' + @spid)
        Select @spid = top 1 spid from master.dbo.sysprocesses
        where dbid = db_id('dbName')
End

次に、データベースをsingle_userモードに設定します

ALTER DATABASE dbName SET SINGLE_USER

次に、復元を実行します...

RESTORE DATABASE and whatnot

接続を再度終了します

(same query as above)

そして、データベースをmulti_userに戻します。

ALTER DATABASE dbName SET MULTI_USER

この方法では、シングルモードに設定する前にデータベースを保持する接続がないことを確認します。前者が存在する場合はフリーズするためです。

2
Eric Wu

上記のどれも私にとってはうまくいきませんでした。私のデータベースには、Activity Monitorまたはsp_whoを使用したアクティブな接続は表示されませんでした。私は最終的にする必要がありました:

  • データベースノードを右クリックします
  • [デタッチ...]を選択します
  • [接続のドロップ]ボックスをオンにします
  • 再接続

最もエレガントなソリューションではありませんが、動作し、SQL Serverを再起動する必要はありません(DBサーバーは他のデータベースをホストしているため、私にとってはオプションではありません)

1
Brent Waggoner

私はこれを好む

ロールバックを即時に使用してデータベースセットをオフラインで変更する

その後、データベースを復元します。その後、

ロールバックをすぐに使用してデータベースセットをオンラインで変更する

0
Aniyan Kolathur