none
SQL Serverのデータベース復元エラーについて

    質問

  • 復元時に以下の警告が発生し復元できません。「プロセスはファイルにアクセスできません。別のプロセスが使用中です。」の警告が発生します。
    全てのデータベースが同じ現象でというわけではありません。該当する分は開発作業中のデータベースです。
    Management Studioのプロセスを確認しましたが対象データベース分は残っていません。
    ただし該当する分はコマンドプロンプトで「RESTORE DATABASE・・・」でmdf及びログファイルを復元すると正常に復元できます。
    開発作業時になんらかのロック(検証などで途中でプログラムがとまっているなど)がかかっていたりしているのでしょうか?

    12/30に追記、ここから

    各DBはバックアップ済みの雛型DB(testdb)より復元してリネームして作成しました。

    しかしながらやり直したことが多々ありコピー先のDBが(以下の例ではaaa)既存であったにもかかわらず以下のコマンドを実行いたしました。

    雛型DBより復元

    sqlcmd -S サーバー名 -U sa -P !!m2bank -Q "RESTORE DATABASE [aaa] FROM DISK='D:\MSSQL\MSSQL13.MSSQLSERVER\MSSQL\Backup\testdb' WITH MOVE 'testdb' TO 'D:\\MSSQL\\MSSQL13.MSSQLSERVER\\MSSQL\\DATA\\aaa.mdf', MOVE 'testdb_log' TO 'D:\\MSSQL\\MSSQL13.MSSQLSERVER\\MSSQL\\DATA\\aaa_log.ldf'
    " > C:\temp\log2.txt

    名前を変更、ログファイルも同様に処理

    sqlcmd -S サーバー名 -U sa -P !!m2bank -Q "ALTER DATABASE [aaa] MODIFY FILE ( NAME = 'testdb', NEWNAME = 'aaa')
    " > C:\temp\log3.txt

    既存ファイルに対して「REPLACE」でなく「WITH MOVE」でおこなったのでこのような事象になっているのでしょうか。データ自体は問題なく登録できています。

    12/30に追記、ここまで

    お手数ですがご教示ください。
    OS:Windows Server2012、SQL Server 2016 R2


    • 編集済み dmisa64 2017年12月30日 1:36
    2017年12月23日 14:19

すべての返信

  • そのエラーが出た際に、SQL Server Management Studioから利用状況モニターを開き、「プロセス」ペインで、そのデータベースを使用しているプロセスを確認してみて下さい。

    利用状況モニターを開く方法 (SQL Server Management Studio)
    https://msdn.microsoft.com/ja-jp/library/ms175518(v=sql.110).aspx


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2017年12月24日 5:23
  • tarapeniyaさま、回答ありがとうございます。

    再度実行した際、確認してみます。

    https://support.microsoft.com/ja-jp/help/3153836/operating-system-error-32-when-you-restore-a-database-in-sql-server-20

    社内の別のものからは同様の事象の発生時、更新プログラム適用すると回避できるかも知れないとの情報を得ました。

    また別名で復元すると問題なく復元可能です。

    最悪オリジナルを削除して別名で復元してさらに名称を変更すると元に戻せる可能性があるのでその方法で対応するかもしれません。

    以上です。

    2017年12月30日 1:34
  • ちょっと遅いとは思いますが

    先に根回しして対象DBのセッションを叩き落してリストアすればいいのでは、

    Use master
    Go

    Declare @dbname sysname

    Set @dbname = 'DB名'

    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


    • 編集済み Mr.Spock 2018年3月2日 9:12
    2018年3月2日 9:11