SQLのリストアが「データベースはすでに開いており、一度に1人のユーザーしか持てません」で失敗する
Summary: ユーザーがデータベースにアクセスするとSQLデータベースのリストアが失敗する問題を解決するためのナレッジベース(KB)記事。
Symptoms
SQLデータベースの元の場所へのリストアが、次のようなエラーで失敗します。
avsql Error <40258>: sqlconnectimpl_smo::get_database_data_names Microsoft.SqlServer.Management.Common.ExecutionFailureException: An exception occurred while executing a Transact-SQL statement or batch. ---> System.Data.SqlClient.SqlException: Database 'Avamar1' is already open and can only have one user at a time.
Cause
1人以上のユーザーまたは接続が、リストア先のデータベースにアクセスしています。データベースにアクセスするユーザーまたは接続がある場合、元のデータベースを上書きすることはできません。
Resolution
データベースのステータスをマルチユーザーモードからシングルユーザーモードに変更します。
SQL Server Management Studio の使用
データベースをシングル・ユーザー・モードに設定するには、次のようにします。
-
オブジェクト エクスプローラーで、SQL Server データベース エンジンのインスタンスに接続し、そのインスタンスを展開します。
-
変更するデータベースを右クリックし、[プロパティ] をクリックします。
-
[Database Properties]ダイアログ ボックスで、[Options]ページをクリックします。
-
[Restrict Access]オプションで、[Single]を選択します。
-
他のユーザーがデータベースに接続している場合は、「オープン接続」メッセージが表示されます。プロパティを変更し、他のすべての接続を閉じるには、[はい] をクリックします。
Transact-SQL の使用
データベースをシングル・ユーザー・モードに設定するには、次のようにします。
-
データベース エンジンに接続します。
-
[Standard]バーで、[New Query]をクリックします。
-
次の例をコピーしてクエリウィンドウに貼り付け、「実行」ボタンをクリックします。この例では、データベースを
SINGLE_USERモードを使用して排他アクセスを取得します。この例では、Avamar1データベースの状態をREAD_ONLYデータベースへのアクセスをすべてのユーザーに返します。終了オプションWITH ROLLBACK IMMEDIATEは、最初のALTER DATABASE陳述。これにより、すべての未完了トランザクションがロールバックされ、Avamar1データベースへのその他の接続はすぐに切断されます。
SQLCopy
USE master; GO ALTER DATABASE Avamar1 SET SINGLE_USER WITH ROLLBACK IMMEDIATE; GO ALTER DATABASE Avamar1 SET READ_ONLY; GO ALTER DATABASE Avamar1 SET MULTI_USER; GO
リファレンス: https://docs.microsoft.com/en-us/sql/relational-databases/databases/set-a-database-to-single-user-mode?view=sql-server-2017
これが完了したら、元の場所へのSQLデータベースのリストアを再試行します。