SQL Server 2005は、アクティブな接続のためにバックアップを復元しません。どうすれば強制できますか?
SQL Server 2005は、アクティブな接続のためにバックアップを復元しません。どうすれば強制できますか?
回答:
データベースを右クリックしてをクリックしTasks
、次にをクリックDetach Database
すると、アクティブな接続のダイアログが表示されます。
「メッセージ」の下のハイパーリンクをクリックすると、アクティブな接続を終了できます。
その後、データベースを切断せずにそれらの接続を強制終了できます。
詳細はこちら。
SQL Server Management Studio 2008のインターフェイスが変更されました。手順は次のとおりです(Tim Leung経由)。
dbをシングルユーザーモードに設定し、復元を実行してから、マルチユーザーに戻したい場合:
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
ROLLBACK IMMEDIATE
かROLLBACK AFTER 60
。そのデータを保存する唯一の方法は、ロールバック後に別のバックアップを実行することです。ただし、別のバックアップから復元しています。だから、待つ意味は何ですか?何か不足していますか?
このコードは私にとってはうまくいきました、それはデータベースのすべての既存の接続を殺します。行@Setname = '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サーバーを再起動すると、ユーザーが切断されます。私が見つけた最も簡単な方法-サーバーをオフラインにしたい場合にも適しています。
ただし、非常に奇妙な理由により、「オフラインにする」オプションでは確実にこれが実行されず、管理コンソールがハングまたは混乱する可能性があります。再起動してオフラインで作業する
時々これはオプションです-例えばあなたが接続のソースであるウェブサーバーを止めたなら。
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サーバーが他の多くのデータベースをホストしていたため、私には選択肢がありません)。
私はこのようにすることを好む、
データベースセットをオフラインに変更し、すぐにロールバックします
次にデータベースを復元します。その後、
データベースセットをオンラインに変更し、すぐにロールバックします