SQLServerでデータベースを復元しようとしたときにエラーとなったので対応方法を備忘録として書きます。
データベースは使用中なので、排他アクセスを獲得できませんでした。
SQLServerのデータベースを復元しようとしたところ以下のメッセージ。
データベース'xxxx'の復元に失敗しました。
追加情報:System.Data.sqlclient.sqlError:データベースは使用中なので、排他アクセスを獲得できませんでした。
(Microsoft.sqlserver.Smo.Extended)
エラー画面
原因はリストアデータベースが他のユーザーに使われているから
このエラーは、リストアを試みているデータベースに誰か接続している状態のため排他制御がかかっていることを表しています。
要は別のユーザーが今使っているのでリストアしないでねと言っています。
排他アクセスエラーの対処法
この場合の対処方法として以下の順番で対応を行えば、大体は解決できると思います。
使用中のユーザーに連絡する
使用中のユーザーまたはプログラムが何なのか特定できる場合は、その処理をしないようにしてもらいます。ただ、セッションが残っているだけで当事者は使用中の意識がないことがほとんどです。
SQL Serverのサービスを再起動する
リストアを行うSQL Serverのインスタンスのサービスを再起動すると大体は解決します。
サービスの再起動によって、現在アクセスしているユーザーはセッションを切られます。
接続先データベースへの既存の接続を閉じる
リストア時に問答無用で現在接続しているものを閉じてリストアすることもできます。
SQLSeverManagementStudioの、データベースの復元のオプションで
[接続先データベースへの既存の接続を閉じる]にチェックを入れてリストアを行えば、接続中の有り無しに問わず問答無用でリストアします。
このオプションにチェックを入れると、データベースがシングルユーザーモードに変更され自分以外のユーザーが使用している接続は、強制的に切られます。
リストアが発生しているときは、システム移行やトラブル発生時など深刻な状況で焦っているかと思いますが慎重に実行してください。
注意事項
注意事項としてこのオプションを入れてリストアを行うと、通常はマルチユーザーモードに戻った形でリストアされますが、シングルユーザーモードになったままになることがあるみたいです。
※今まで一度もなったことはありませんが。。
この時は、以下のSQLを実行すればマルチユーザーモードに戻ります。
ALTER DATABASE データベース名
SET MULTI_USER;
まとめ
- リストア時に排他アクセスエラーが出る原因は、自分以外の他のユーザーが使用しているため
- SQL Serverのサービスを再起動すれば、大体は排他アクセスが解除される。
- サービス再起動でもダメな場合はシングルユーザーモードでリストアを行う。(接続先データベースへの既存の接続を閉じる。)
- リストア完了後もシングルユーザーモードになっていた場合は、マルチユーザーに戻す。
コメント