web-dev-qa-db-ja.com

データベースの復元中のシングルユーザーモード

データベースを復元する前に、データベースをシングルユーザーモードにする必要がありますか?その場合、SQLサーバーをシングルユーザーモードにするか、復元する前にデータベースをシングルユーザーモードのみにする方が望ましいです。ありがとうございました。

3
SqlNovice

masterデータベースを復元する場合にのみ、SQL Serverインスタンスをシングルユーザーモードにする必要があります。 userデータベースの場合、復元するデータベースへのアクティブな接続がないことを確認する必要があります。アクティブなSPID(データベースがシングルユーザーモードである必要はない)を特定して強制終了するか、次のいずれかを使用してデータベースをシングルユーザーモードにする必要があります(Greg Robidouxによる投稿を参照 SQL Serverデータベースを復元するための排他的アクセスを取得しています

ALTER DATABASE [Test4] SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
OR 
ALTER DATABASE [Test4] SET SINGLE_USER WITH ROLLBACK AFTER 30 
OR 
ALTER DATABASE [Test4] SET SINGLE_USER WITH NO_WAIT 
  • WITH ROLLBACK IMMEDIATE-このオプションは、トランザクションが完了するまで待機せず、開いているすべてのトランザクションのロールバックを開始するだけです。
  • WITH ROLLBACK AFTER nnn-このオプションは、開いているトランザクションが完了するまでnnn秒待機した後、開いているすべてのトランザクションをロールバックします。この例では、開いているトランザクションをロールバックする前にプロセスが30秒待つ必要があることを指定しています。
  • WITH NO_WAIT-このオプションは、すべてのトランザクションが完了した場合にのみ、データベースをシングルユーザーモードに設定します。指定された期間待機し、トランザクションが完了していない場合、プロセスは失敗します。これはトランザクションをロールバックしないため、最もクリーンなアプローチですが、開いているトランザクションがある場合は常に機能するとは限りません。

データベースをシングルユーザーモードにすると、データベースへの排他的アクセスが可能になり、問題なく復元できます。

注:ROLLBACKオプションを使用すると、データベースにまだ存在する開いているトランザクションがロールバックされます。ロールバックプロセスは問題なく機能するはずですが、トランザクションの実行時間が非常に長い場合、ロールバックプロセスに時間がかかる可能性があるため、システムで何が実行されているかに注意してください。テストおよび開発システムでは、復元を実行しているのでトランザクションは関係ありません。したがって、ロールバックは問題になりませんが、長時間実行されているトランザクションのロールバックには時間がかかる場合があることに注意する必要があります。

7
Scott Hodgin

このデータベースに接続している場合、データベースを復元できません。エラーが発生します。

データベース 'my_db_name'はこのセッションで使用されているため、RESTOREはデータベースを処理できません

つまり、別のデータベースに接続されているデータベースを復元する必要があります(推奨)master

しかし、データベースをmasterからsingle_userに(復元前に)配置すると、データベースをsingle_userに配置してから復元するまでの間に、誰かがそのデータベースに接続する可能性があります。

この状況を回避するには、single_userではなく、データベースをofflineに配置します。

alter database ... set offline with rollback immediate;
restore database ...;
4
sepupic