web-dev-qa-db-ja.com

OSエラー32で復元が失敗し、ファイルが別のプロセスで使用されている

お客様のDB展開を(部分的に)自動化するための一連の手順を書いていますが、これはほとんど正常に機能しますが、ファイルが別のプロセスで使用されていることに関するRESTOREコマンドがOSエラー32で失敗する場合があります(詳細は以下)。

私はこれを広範囲にグーグルで調べましたが、私の特定のケースに適用されるものはほとんど見つかりませんでした。見落としていることがあるのではないかと思いますが、見つけられないようです。

コマンドは次のとおりです。

RESTORE DATABASE [NBBC_Logistics] FROM DISK = '\\wpdboardq01\Shares\DbCopy\DevBackups\NBBC_Logistics_140916112310.bak' 
    WITH FILE=1, NOUNLOAD, STATS=10,
     MOVE 'NBBC_Logistics' TO 'D:\MSSQL2K12\MSSQL11.MSSQLSERVER\MSSQL\DATA\NBBC_Logistics.mdf',
     MOVE 'NBBC_Logistics_log' TO 'D:\MSSQL2K12\MSSQL11.MSSQLSERVER\MSSQL\DATA\NBBC_Logistics_log.ldf',
     REPLACE 
    ;

その結果、次のエラーメッセージが表示されます。

Msg 3634, Level 16, State 1, Line 11
The operating system returned the error '32(The process cannot access the file because it is being used by another process.)' while attempting 'RestoreContainer::ValidateTargetForCreation' on 'D:\MSSQL2K12\MSSQL11.DEV\MSSQL\DATA\NBBC_Logistics_log.ldf'.
Msg 3156, Level 16, State 8, Line 11
File 'NBCC_Logistics_Model2_log' cannot be restored to 'D:\MSSQL2K12\MSSQL11.DEV\MSSQL\DATA\NBBC_Logistics_log.ldf'. Use WITH MOVE to identify a valid location for the file.
Msg 3119, Level 16, State 1, Line 11
Problems were identified while planning for the RESTORE statement. Previous messages provide details.
Msg 3013, Level 16, State 1, Line 11
RESTORE DATABASE is terminating abnormally.

注意すべき点:

  1. これは、受信SQLインスタンスの一部でのみ発生し、それらのほとんどは問題なく非常に類似したコマンドを実行しています。

  2. 失敗しているインスタンスは、同じボックス(DEVとQA)に複数のSQLインスタンスがあり、DEVから同じデータベースのQAバージョンにDBバックアップを復元しようとしているインスタンスです。

  3. この同じインスタンス内の他のDBは、対応するRESTOREコマンドを問題なく実行できます。

  4. (エラーに示されている)ソース論理ファイル名が既存のDB(コマンドで指定されている)と異なることは関係があるかもしれませんが、これが機能する場合があると思います。

  5. また、エラーによって報告されるファイルパスは、MOVEで指定しているものではなく、元のファイルパス(DEVインスタンスで使用されている元のDBファイルがまだある)ではないことに注意してください。

そのため、最初にDBファイルを元のパスの場所に復元し、その後、指定したパスにそれらを移動しようとしているようです。これは、ドキュメントに書かれていることとは対照的であり、DBコピーを復元するユーザーは、元のファイルの場所を制御できず、そのようなパスが存在し、まだ使用されていないことを保証できないため、明らかに一般的には動作しません。 。

どんな助けでも大歓迎です。


適用されない自動応答のいくつかを回避するために:

  • ターゲットデータベースは現在、私や他の誰も使用していません。
  • sp_lockにも表示されません
  • コマンドはREPLACEを指定し、既存のデータベースを上書きする想定です。
  • 指定されたファイルは、他のWindowsプロセスによって開かれていません
  • ただし、エラーで言及されているファイルareボックスの他のSQLインスタンスによって開かれています
  • 共有上のBAKファイルの場所はそれとは無関係であり、ローカルにコピーしても何も変更せず、名前を変更することもありません。
  • 指定されたdbファイルとパスareターゲットデータベースの正しいパス
4
RBarryYoung

バックアップファイルを使用する場合は、必ず論理ファイル名を使用してください。同じバックアップファイル内で複数のバックアップセットを使用する場合は、使用しているファイルが正しいことを確認してください。

この場合には:

File 'NBCC_Logistics_Model2_log' cannot be restored to 'D:\MSSQL2K12\MSSQL11.DEV\MSSQL\DATA\NBBC_Logistics_log.ldf'. Use WITH MOVE to identify a valid location for the file.

論理ファイル名が間違っているか、バックアップセット内のバックアップが間違っているようです。あなたがこれを指摘したのは知っていますが、バックアップセットの情報を調べて再確認することは理にかなっています。

3
Sean Gallardy

パスの「\\」など、ファイル名に「タイプミス」または構文エラーがないか探します。それらを解決し、あなたの声明は機能します。

(もちろん、パスのタイプミスは、誤ったファイル名に関する上記の回答のバージョンですが、その問題の特定のケースです!)

0
Mark E