接続がアクティブなため、SQL Server 2005 がバックアップを復元しません。どうすれば強制できますか?
10 に答える
データベースをシングルユーザーモードに設定し、復元を実行してから、マルチユーザーに戻します。
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
SQL Server マネジメント スタジオ 2005
データベースを右クリックし、 をクリックしてTasks
から をクリックDetach Database
すると、アクティブな接続を示すダイアログが表示されます。
「メッセージ」の下のハイパーリンクをクリックすると、アクティブな接続を切断できます。
その後、データベースをデタッチせずにそれらの接続を切断できます。
詳細はこちら。
SQL Server マネジメント スタジオ 2008
SQL Server Management Studio 2008 のインターフェイスが変更されました。手順は次のとおりです ( Tim Leung経由) 。
- オブジェクト エクスプローラーでサーバーを右クリックし、[アクティビティ モニター] を選択します。
- これが開いたら、[プロセス] グループを展開します。
- ドロップダウンを使用して、データベース名で結果をフィルタリングします。
- 右クリックの [プロセスの強制終了] オプションを選択して、サーバー接続を強制終了します。
このコードは私のために働きました、それはデータベースのすべての既存の接続を殺します。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
この後、私はそれを復元することができました
これを試して:
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
SQL サーバーを再起動すると、ユーザーが切断されます。私が見つけた最も簡単な方法 - サーバーをオフラインにしたい場合にも適しています。
しかし、いくつかの非常に奇妙な理由により、「オフラインにする」オプションはこれを確実に実行せず、管理コンソールをハングさせたり混乱させたりする可能性があります。再起動してからオフラインにする
場合によっては、これがオプションになることもあります。たとえば、接続のソースである Web サーバーを停止した場合などです。
これらのどれも私のために働いていませんでした、現在のユーザーを削除したり切断したりすることができませんでした。また、DBへのアクティブな接続を確認できませんでした。SQL Serverを再起動する(右クリックして[再起動]を選択)と、それが可能になりました。
既に与えられたアドバイスに加えて、DB を使用する IIS を介して実行されている Web アプリがある場合は、復元中にアプリのアプリ プールを停止(リサイクルではなく) してから再起動する必要がある場合もあります。アプリ プールを停止すると、アクティブな http 接続が切断され、それ以上の接続が許可されなくなります。そうしないと、データベースに接続してロックするプロセスがトリガーされる可能性があります。これは、データベースを復元するときの Umbraco コンテンツ管理システムなどの既知の問題です。
上記のどれも私にとってはうまくいきませんでした。アクティビティ モニターまたは sp_who を使用して、データベースにアクティブな接続が表示されませんでした。私は最終的にしなければなりませんでした:
- データベースノードを右クリック
- 「切り離す...」を選択
- 「ドロップ接続」ボックスにチェックを入れます
- 再取り付け
最もエレガントなソリューションではありませんが、機能し、SQL Server を再起動する必要はありません (DB サーバーが他のデータベースの束をホストしていたため、私にとってはオプションではありません)。