web-dev-qa-db-ja.com

.bakファイルからSQLサーバーを復元する排他的アクセスを取得できませんでした

Bakファイルを使用してSQLを復元しようとしています

エラーが発生しています

データベースが使用中であるため、排他的アクセスを取得できませんでした

私は試した

USE [master]
ALTER DATABASE myDB
SET SINGLE_USER WITH ROLLBACK IMMEDIATE;

クエリを実行します

USE [master] RESTORE DATABASE  myDB
   FROM DISK = 'C:\MyDatabase.bak' WITH  FILE = 1,  NOUNLOAD,  STATS = 10

復元ウィザードからも同じ結果を試しました。

データベースが使用中であるため、排他的アクセスを取得できませんでした。

16
baaroz

方法1

    declare @sql as varchar(20), @spid as int

    select @spid = min(spid)  from master..sysprocesses  where dbid = db_id('<database_name>')  and spid != @@spid    

    while (@spid is not null)

    begin

    print 'Killing process ' + cast(@spid as varchar) + ' ...'

    set @sql = 'kill ' + cast(@spid as varchar)

exec (@sql)

select 

    @spid = min(spid)  

from 

    master..sysprocesses  

where 

    dbid = db_id('<database_name>') 

    and spid != @@spid
 end 

 print 'Process completed...'

方法2

  alter database database_name
  set offline with rollback immediate
  alter database database_name
  set online

行く

19
MAS

この問題を解決するためにクエリを記述する必要はありません。私は同じ問題を数回抱えていて、この方法でそれを解決します:データベースを復元するとき

  1. [データベースの復元]ウィンドウの[オプション]タブに移動します
  2. チェック(既存のデータベースを上書き(置き換え))
  3. チェック(接続先データベースへの既存の接続を閉じる)
  4. OKをクリックします

データベースの復元を開始しています...

8
Hamed R

上記の問題を抱えていて、どのアドバイスも機能しない人は誰でも。「オプション」の下でTaillogバックアップをオフにしてください。

このオプションをオン(またはオン)にすると、ソースデータベース自体の末尾ログの取得が試行されます(復元のソースが単なるファイルであっても)。したがって、ソースデータベースが使用中の場合(本番データベースのコピーを実行している場合は、通常はそうなります)、復元は失敗します。

7
Craig

既にデータベースが存在する開発サーバーに本番バックアップを復元しようとしたときに、この問題が発生しました。ターゲットデータベース名を変更してコピーとして復元したかったのですが、実際にはファイルに問題がありました。デフォルトでは、すでに存在するファイルを上書きしようとしました。復元ダイアログの「ファイル」ページで「すべてのファイルをフォルダーに再配置」をチェックし、ファイルの衝突が発生しないように新しいディレクトリを選択することで問題を修正しました。

0
Evan M