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