1. ホーム
  2. sql

[解決済み] SQL-Serverです。エラー - データベースが使用中のため、排他的なアクセスを取得できませんでした。

2022-03-04 12:49:28

質問

私は実際に1つのバックアップファイルから1つのデータベースを復元するスクリプトを(Sql Server 2008で)作ろうとしています。以下のコードを作成しましたが、エラーが発生しました。

Msg 3101, Level 16, State 1, Line 3
Exclusive access could not be obtained because 
the database is in use.
Msg 3013, Level 16, State 1, Line 3
RESTORE DATABASE is terminating abnormally.

この問題を解決するにはどうすればよいですか?

IF DB_ID('AdventureWorksDW') IS NOT NULL 
BEGIN 
RESTORE DATABASE [AdventureWorksDW] 
FILE = N'AdventureWorksDW_Data' 
FROM  
DISK = N'C:\Program Files\Microsoft SQL Server\
MSSQL10_50.SS2008\MSSQL\Backup\AdventureWorksDW.bak' 
WITH  FILE = 1, 
MOVE N'AdventureWorksDW_Data' 
TO N'C:\Program Files\Microsoft SQL Server\
MSSQL10_50.SS2008\MSSQL\DATA\AdventureWorksDW.mdf', 
MOVE N'AdventureWorksDW_Log'  
TO N'C:\Program Files\Microsoft SQL Server\
MSSQL10_50.SS2008\MSSQL\DATA\AdventureWorksDW_0.LDF', 
NOUNLOAD,  STATS = 10 
END

解決方法は?

dbをリストアする場合、そのdb上の既存のトランザクションは気にしないものとします。 そうですよね? もしそうなら、これはあなたのために働くはずです。

USE master
GO

ALTER DATABASE AdventureWorksDW
SET SINGLE_USER
--This rolls back all uncommitted transactions in the db.
WITH ROLLBACK IMMEDIATE
GO

RESTORE DATABASE AdventureWorksDW
FROM ...
...
GO

さて、もう一つ気をつけなければならないことがあります。 DBをシングルユーザーモードにした後、他の人がそのデータベースに接続しようとする可能性があります。 もし彼らが成功したら、復元を進めることができなくなります。 これは競争です。 私の提案は、3つのステートメントをすべて一度に実行することです。