SQL Server 「データベースは使用中なので、排他アクセスを獲得できませんでした」 で復元の失敗時の対処方法
「データベースは使用中なので、排他アクセスを獲得できませんでした」 で復元の失敗
バックアップファイルからデータベースをリストアしようとした時に 「 データベース * の復元に失敗しました。 」 「 データベースは使用中なので、排他アクセスを獲得できませんでした。 」 のようにエラーが出て、復元できない時があると思います。
今回はデータベースが使用中で復元を失敗した時の対処方法です。
利用状況モニター(Activity Monitor) で利用状況を確認する
利用状況モニターを見ると、復元しようとしているデータベースを利用しているプロセスなどを確認することができます。
SQL Server Management Studio の オブジェクトエクスプローラでサーバーを右クリックし、[利用状況モニター] を選択します。
利用状況モニターが表示されるので、「 プロセス 」 を開いて 「 データベース 」 カラムのフィルターで復元したいデータベースを選択します。
現在、そのデータベースを利用しているプロセスが表示されるので、詳細などを確認して、強制終了しても良いか確認します。
[サーバー接続] オプションでプロセスを強制終了してデータベースを復元する
復元したいデータベースの既存のプロセスを全てロールバックさせて強制終了しても良い場合は、次のようにプロセスを強制終了してデータベースを復元することができます。
新しい SQL Server Management Studio では、[データベースの復元] 画面の [オプション] ページに、[サーバー接続] のオプションがあり [既存の接続を閉じる]を選択して復元を実行します。
このオプションを ON にして復元を実行すると、他の接続はロールバックして強制終了され、データベースがシングルユーザーモードに設定され、データベースを復元し、その後マルチーユーザーモードに戻してくれます。
※ もしなんらかの原因でシングルユーザーモードのままになってしまった時は、以下のスクリプトでマルチユーザーモードに戻せます。
USE master; GO ALTER DATABASE [データベース名] SET MULTI_USER; GO
マニュアルでプロセスを強制終了してデータベースを復元する
古い SQL Server Management Studio には、[データベースの復元] 画面に [サーバー接続] オプションがありません。
既存の接続を強制終了するにはいろいろ方法がありますが、プロセス数が多くない場合、手っ取り早い方法は先ほどの [利用状況モニター] でひとつひとつ強制終了する方法です。
強制終了したいプロセスを選択して右クリックし、[強制終了]を選択して、復元したいデータベースに接続しているプロセスを強制終了してから、データベースの復元を実行します。
マニュアルでシングルユーザーモードにしてデータベースを復元する
もしプロセス数が多い場合や、強制終了しても次々とまたプロセスが増えたりして、マニュアルでの強制終了が追いつかないようなケースがあるかもしれません。
そんな時は、処理をロールバックさせてシングルユーザーモードにし、そのまま同じ接続でデータベースの復元をスクリプトで実行し、復元が終わったらマルチーユーザーモードに戻してください。
一度、シングルユーザーモードにして、UI から復元しようとしたり、いろいろやっていると、同時に一人しか接続できないとうようなエラーになる可能性があります。
例えば、Test という名前のデータベースに、同じ Test データベースの完全バックアップファイルから上書きで復元するような場合は次のように実行することができます。
USE master; GO ----------------- ALTER DATABASE Test SET SINGLE_USER WITH ROLLBACK IMMEDIATE; ----------------- RESTORE DATABASE Test FROM DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER01\MSSQL\Backup\Test.bak' WITH REPLACE; ----------------- ALTER DATABASE Test SET MULTI_USER;