復旧パス

差分バックアップまたはログ バックアップを使用していて、次のいずれかの方法で以前の特定の時点までデータベースを復旧する場合、復旧パスを理解しておくことが重要です。

  • 特定の時点への復元を実行する。

  • すべてのログ バックアップまたは最新の差分バックアップを先に復元せずに、復旧を実行する。

データベースを以前の復旧ポイントまで復旧し、そのポイントからデータベースの使用を開始すると、そこから新しい復旧パスが始まります。復旧パスは、ある時点までに行われたデータベース操作を反映する一連のデータ バックアップとログ バックアップです。通常のデータベース利用、またはデータとログの特定の復元が対象となります。復旧パスは、データベースの一貫性を維持しつつ、その内容がどのような操作によって、時間の経過と共にどのように変化してきたかを一意に表します。次の図に、復旧ポイントと生成される復旧パスの関係を示します。

回復ポイントおよび回復したパス

次の状況では、データベースが "終了時点" まで復元されないため、新しい復旧パスが作成されます。これ以降のバックアップでは、同じデータベースが 2 つ以上の復旧パスに分岐し、これらに対して同じ範囲の LSN が使用されることになります。

  • データベースの完全バックアップを復元し、他の種類のバックアップを使用せずにデータベースを復旧する場合。

  • 最新の差分バックアップ以外の差分バックアップの最後でデータベースを復旧する場合。

  • データベースの完全バックアップおよび差分バックアップを復元し、既存のトランザクション ログ バックアップを適用しないでデータベースを復旧する場合。

  • 最新のトランザクション ログ バックアップ以外のトランザクション ログ バックアップの最後でデータベースを復旧する場合。

  • トランザクション ログ バックアップ内の特定の時点またはマーク付きのトランザクションでデータベースを復旧する場合。

一般に、復旧ポイントによってトランザクションがロールバックされる場合は、復旧ポイントから新しい復旧パスが開始されます。場合によっては、既に存在するバックアップのログ シーケンス番号 (LSN) が、この復旧ポイントの LSN より大きくなることがあります。これは、既存のバックアップの LSN が、最新の復旧操作によって生成された新しいブランチとは別の復旧ブランチ上に存在するためです。

ベスト プラクティス   複数の復旧分岐を含む復旧パスが作成されないようにするには、データベースを復旧した後、できるだけ早くデータの完全なバックアップ手順を実施します。この方法により、すべてのバックアップが 1 つの復旧ブランチ上で確実に行われます。これを確認するには、データをバックアップした後に、backupset テーブルの last_recovery_fork_guid 列、または RESTORE HEADERONLY 結果セットを参照します。

復旧パスの例

最初は、次の図に示すように、データベースのすべてのバックアップで 1 つの復旧パスが形成されます。この図の復旧パスには、t1 の時点で作成されたデータベース バックアップ、および t2、t3、t4 の各時点で作成された 3 つのログ バックアップが含まれています。

元の復旧パス

次の図は、データベースを過去のある時点に復旧したことで作成された復旧分岐を示しています。バックアップ t4 に問題があるために、データベース管理者は t3 ログ バックアップの最後でデータベースを復旧します。この復元によって復旧分岐が作成されます。t5 の時点で、新たなログ バックアップによって新しい復旧ブランチ 2 が開始されます。

2 つ目の復旧ブランチの作成

注意

t5 ログ バックアップには、このバックアップを復旧ブランチ 1 上の t3 ログ バックアップに接続する復旧分岐メタデータが含まれています。復旧分岐メタデータについては、このトピックの「復旧分岐の管理」を参照してください。

上記の図に示されている例により、次の図に示す新しい復旧パスが作成されます。新しい復旧パスには、復旧ブランチ 1 上のバックアップの一部 (t1 ~ t3) と、復旧ブランチ 2 上のすべてのログ バックアップ (t5 ~ t9) が含まれています。この復旧パスの観点では、ログ バックアップ t4 は使用されていません。

新しい復旧パス

特定の時点への復元を行った後の次のバックアップでは、必ず復旧分岐が作成されます。次の図では、特定の時点への復元が t4 ログ バックアップの途中で完了しています。データベースをその時点へと復旧すると、復旧分岐が作成されます。その後に、復旧されたデータベース上に t5 の時点でログ バックアップが作成されることで、復旧ブランチ 2 が構築され、新しい復旧パスが作成されます。新しいブランチ上の最初のログ バックアップである t5 は、ログ バックアップ t3 と同じ先頭 LSN を含んでおり、t3 に置き換わります。したがって、新しい復旧パスでは t3 と t4 の両バックアップが使用されません。

特定の時点への復元後の、新しい復旧パス

この新しい復旧パス上のバックアップを復元するための復元シーケンスは、t1、t2、および t5 です。それ以降のバックアップは復旧ブランチ 2 で作成され、新しい復旧パスに組み込まれます。

古いパスをたどってロールフォワードすることによって、前の状態を再現するには

通常、複数の復旧パスが存在する場合は、最新のパスをデータベースの復元に優先的に使用します。古い復旧パスは、使用しないことをお勧めします。ただし、必要であれば、現在の復旧パスが生成される前に作成した一連のバックアップを使用することで、古い復旧パスをたどってロールフォワードすることができます。たとえば、特定の時点への復旧より前に生成したバックアップを使用すれば、古いパスに沿って以後のポイントを再現できます。

たとえば、上の図で作成したバックアップの場合、ログ バックアップ t5 を作成した後でも、t1 で作成されたデータベースの完全バックアップからログ バックアップ t4 の終了時点まで復元することが可能です。このバックアップは古い復旧パス上にあります。

古いパスから新しいパスまでロールフォワードすることによって、前の状態を再現するには

SQL Server データベース エンジンでは、矛盾する複数のバックアップが復元シーケンスに使用されないように (それぞれ異なる復旧パスをたどってロールフォワードが行われないように) 制御されます。これによって、復旧後のデータベースの一貫性が維持されます。

以前の状態を復元する際、新しい復旧パスに従ってロールフォワードする場合は、復旧ポイント前のバックアップ、および復旧ポイント後のバックアップについて、復元シーケンスをそれぞれ別個に設ける必要があります。

  1. 新しい復旧パスの開始位置である復旧ポイントより前に作成したバックアップを復元します。その復旧ポイントを含んでいるバックアップは除外します。

  2. 新しい復旧パスに従ってロールフォワードします。つまり、復旧パスの生成以降に作成したバックアップを復元します。

復旧分岐の管理

復旧ブランチは、同じ GUID を共有する一連の LSN です。開始ポイント (LSN、GUID) から終了ポイント (LSN、GUID) までの一連の LSN が 1 つの復旧パスとなります。復旧パスの LSN は、開始ポイントから終了ポイントまですべてが 1 つの復旧ブランチに属する場合もあれば、複数の復旧ブランチに属する場合もあります。新しい復旧ブランチは、データベースが作成され、RESTORE WITH RECOVERY によって復旧分岐が生成された時点から始まります。

復旧分岐は、新しい復旧ブランチの開始ポイント (LSN、GUID) であり、RESTORE WITH RECOVERY を実行するたびに生成されます。復旧分岐によって、復旧ブランチ間の親子関係が決定します。

データベースを復旧すると、次の LSN を含めたデータベース状態全体が復旧ポイントに設定されます。すると、LSN は fork_point_lsn から再使用されます。したがって、復元シーケンスを構成するときは、同じ LSN が複数の分岐上に存在する可能性があるので、バックアップ間には LSN だけでなく復旧分岐によるリンクも設定する必要があります。次の図は、LSN の再利用を示しています。LSN が異なる複数の復旧分岐でどのように再利用されているか、確認してください。図の中の緑のボックスは、同じ LSN を使用する 2 つのバックアップを示しています。

異なる回復段階における LSN の再使用方法

復旧分岐を超えて複数のバックアップを復元シーケンスに組み込む必要のある場合は、使用するバックアップが正しい復旧パスをたどって復旧ポイントに達するように、復元シーケンスを構成する必要があります。そのために、バックアップには最初の復旧分岐と最後の復旧分岐の GUID が含まれています。

これらの GUID は、復旧パスの追跡に関連する他のメタデータと共に backupset 履歴テーブルに格納されます。また、RESTORE HEADERONLY ステートメントによって返されます。次の表は、復旧分岐をたどる復元シーケンスの構築に関連するメタデータ値をまとめたものです。これらの値の列名は、履歴テーブルと RESTORE HEADERONLY ステートメントの結果セットとで異なっていることに注意してください。

LSN

説明

backupset の列名

RESTORE HEADERONLY の列名

最初の復旧分岐の GUID

最初の復旧分岐の ID。

first_recovery_fork_guid

FirstRecoveryForkID

最後の復旧分岐の GUID

最後の復旧分岐の ID。

last_recovery_fork_guid

RecoveryForkID

最初の LSN

バックアップ セット内の先頭または最も古いログ レコードのログ シーケンス番号。

first_lsn

FirstLSN

最後の LSN

バックアップ セットの次にあるログ レコードのログ シーケンス番号。

last_lsn

LastLSN

分岐ポイントの LSN

最初の復旧ポイント GUID が最後の復旧ポイント GUID と等しくない (≠) 場合の、分岐ポイントのログ シーケンス番号。それ以外の場合は、バックアップに復旧分岐が生成されず、分岐ポイント LSN は NULL になります。

fork_point_lsn

ForkPointLSN

差分ベースの GUID

シングル ベースの差分バックアップの場合は、差分ベースの一意識別子。

マルチ ベースの差分バックアップの場合は NULL。差分ベースはファイル レベルで決定される必要があります。詳細については、「backupfile (Transact-SQL)」を参照してください。

差分バックアップ以外のバックアップの場合は NULL。

differential_base_guid

DifferentialBaseGUID

この後の説明では、backupset 履歴テーブルでの値の名前のみを使用します。

  • シーケンスが確実に正しい分岐をたどるようにするために、最後の復旧分岐 GUID と最初の復旧分岐 GUID を使用してバックアップが結び付けられます。シーケンス内の各ログ バックアップを復元するには、first_recovery_fork_guid が、そのシーケンスの前のバックアップの last_recovery_fork_guid と同等である必要があります。

    first_recovery_fork_guid = last_recovery_fork_guid

  • データ バックアップおよび差分バックアップもリンクする必要があります。

    ログ バックアップに、分岐ポイントと、データベースの完全バックアップまたは差分バックアップの最終 LSN が両方とも含まれている場合、リンク テストの結果は、分岐ポイントを基準とする最終 LSN の相対位置によって左右されます。

    リンク テストは、backupset の値を使用して次のように行われます。

    • last_lsnfork_point_lsn 以下の場合、データ バックアップまたは差分バックアップの last_recovery_fork_guid は、ログ バックアップの first_recovery_fork_guid と同等である必要があります。次の図に、last_lsnfork_point_lsn よりも小さい例を示します。

      last_lsn は fork_point_lsn よりも小さい

    • last_lsnfork_point_lsn より大きい場合、データ バックアップまたは差分バックアップの last_recovery_fork_guid は、ログ バックアップの last_recovery_fork_guid と同等である必要があります。次の図に、last_lsnfork_point_lsn よりも大きい例を示します。

      last_lsn は fork_point_lsn よりも大きい

  • 差分バックアップの場合は、backupset.differential_base_guid を使用して差分ベースを特定します。

    差分がマルチベースで、backupset.differential_base_guid が NULL の場合は、backupfile.differential_base_guid を使用してファイル別に差分ベースを特定する必要があります。