web-dev-qa-db-ja.com

データベースを開けません。復元の途中ですか?

スタンバイモードを使用してログ配布を設定しました([バックアップの復元時にデータベース内のユーザーを切断する]がオフになっています)。

次のコードをセカンダリサーバー/データベースで実行することをテストしました。

declare @a int
while 1=1
begin
  select @a = count(*) from ....
end

ただし、ログ配布復元ジョブの実行が開始されると、コードは次のエラーで停止します。

データベースを開けません。復元の途中です。

問題を回避する方法は?

5
u23432534

これは、ログ配布がどのように機能するかのようなものです。ログバックアップを適用するには、データベースへの排他的アクセスが必要です。つまり、スクリプトはデータベースをsingle_userに設定するか、ログバックアップを適用する前にすべてのユーザーを削除する必要があります。

いくつかの回避策:

  1. 営業時間外に復元をスケジュールし、その間に古いデータのクエリを続行できるようにします。
  2. 複数のログバックアップをキューに入れ、たとえば1時間ごとまたは2時間ごとに適用します。ユーザーは1日を通して定期的に更新を受け取ります。中断の頻度はプライマリのログバックアップスケジュールよりも少なくなっています。
  3. スクリプトでユーザーを強制的に追い出さないでください。つまり、ログの復元はデータベースへのアクティブな接続がなくなるまで待機し、待機します。私は実際にこれを試したことはありません。その実現可能性は、セカンダリがどの程度アクティブであるかによって大きく異なります。
  4. 複数のセカンダリがあり、それらを循環します。 このアプローチについてはかなり広範囲にわたって書きました
5
Aaron Bertrand

まず、データベースが実際に復元されているかどうかを最初に確認します。これは、ステータスのレポートに使用するクエリです。

SELECT session_id AS SPID
          ,command
          ,a.TEXT AS Query
          ,start_time
          ,percent_complete
          ,dateadd(second, estimated_completion_time / 1000, getdate()) AS estimated_completion_time
    FROM sys.dm_exec_requests r
    CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) a
    WHERE r.command IN ('BACKUP DATABASE','RESTORE DATABASE')
1
trocheaz