復旧パス
差分バックアップまたはログ バックアップを使用していて、次のいずれかの方法で以前の特定の時点までデータベースを復旧する場合、復旧パスを理解しておくことが重要です。
- 特定の時点への復元を実行する。
- すべてのログ バックアップまたは最新の差分バックアップを先に復元せずに、復旧を実行する。
データベースを以前の復旧ポイントまで復旧し、そのポイントからデータベースの使用を開始すると、そこから新しい復旧パスが始まります。復旧パスは、ある時点までに行われたデータベース操作を反映する一連のデータ バックアップとログ バックアップです。通常のデータベース利用、またはデータとログの特定の復元が対象となります。復旧パスは、データベースの一貫性を維持しつつ、その内容がどのような操作によって、時間の経過と共にどのように変化してきたかを一意に表します。次の図に、復旧ポイントと生成される復旧パスの関係を示します。
トランザクションをロールバックすると、そのデータベースは一意な状態になるので、通常は、復旧ポイントから新しい復旧パスが開始されます。場合によっては、既に存在するバックアップのログ シーケンス番号 (LSN) が、この復旧ポイントの LSN より大きくなることがあります。これは、既存のバックアップの LSN が、最新の復旧操作によって生成された新しいブランチとは別の復旧ブランチ上に存在するためです。
メモ : |
---|
データベースの完全バックアップを復元し、他の種類のバックアップを使用せずにデータベースを復旧すると、新しい復旧パスが作成されます。 |
ベスト プラクティス 複数の復旧分岐を含む復旧パスが作成されないようにするには、データベースを復旧した後、できるだけ早くデータの完全なバックアップ手順を実施します。この方法により、すべてのバックアップが 1 つの復旧ブランチ上で確実に行われます。これを確認するには、backupset テーブルの last_recovery_fork_guid 列、または RESTORE HEADERONLY 結果セットを参照します。
次の状況では、データベースが "終了時点" まで復元されないため、新しい復旧パスが作成されます。これ以降のバックアップでは、同じデータベースが 2 つ以上の復旧パスに分岐し、これらに対して同じ範囲の LSN が使用されることになります。
- データベースの完全バックアップおよび差分バックアップを復元し、既存のトランザクション ログ バックアップを適用しないでデータベースを復旧する場合。
- 最新の差分バックアップ以外の差分バックアップの最後でデータベースを復旧する場合。
- 最新のトランザクション ログ バックアップ以外のトランザクション ログ バックアップの最後でデータベースを復旧する場合。
- トランザクション ログ バックアップ内の特定の時点またはマーク付きのトランザクションでデータベースを復旧する場合。
復旧パスの例
次の図に、データベースが復旧されるときの新しい復旧パスの分岐を示します。この図では、データベースの 1 つの完全バックアップと、4 つのログ バックアップのシーケンスが作成されています。データベースの完全バックアップ、ログ バックアップ 1、ログ バックアップ 2 を復元することによって、ログ バックアップ 2 の終了ポイントまでデータベースが復元されます。データベースはこの時点の状態に戻り、そこからまた新しい復旧分岐が作成されます。その後、データベースをしばらく使用すると、さらに 2 つのトランザクション ログ バックアップ (ログ バックアップ 5 とログ バックアップ 6) が作成されます。
データベース バックアップと最初の 4 つのログ バックアップは、すべてブランチ 1 にあります。ログ バックアップ 5 とログ バックアップ 6 はブランチ 2 にあります。復旧分岐には、ログ バックアップ 2 の最後の LSN (Log_Backup_2.LastLSN) とログ バックアップ 5 の最初の LSN (Log_Backup_5.FirstLSN) が含まれます。
ログ バックアップ 5 内では、first_recovery_fork_guid はブランチ 1 を示し、last_recovery_fork_guid はブランチ 2 を示します。復旧パスはブランチ 1、ブランチ 2 です。
メモ : |
---|
ログ バックアップの終了ポイントまでデータベースを復元したとき、常に新しい分岐パスが作成されるとは限りません。 |
古いパスをたどってロールフォワードすることによって、前の状態を再現するには
古い復旧パスは、使用しないことをお勧めします。古い復旧パスを使用すると、データベースに対してコミットされたトランザクションが 2 つの異なる時間間隔内に存在することになるためです。ただし、必要に応じて、現在の復旧パスが生成される前に作成した一連のバックアップを使用することで、古い復旧パスをたどってロールフォワードすることができます。たとえば、特定の復旧ポイントより前に生成したバックアップを使用すれば、古いパスに従って各ポイントを再現することができます。
メモ : |
---|
共通の親から 2 つのデータベースを作成するには、各データベースについて、そのデータベースの終了時点に達するために使用する復旧パスが 1 つになるように検討してください。 |
たとえば、上の図で作成したバックアップの場合、ログ バックアップ 5 と ログ バックアップ 6 を作成した後でも、古い復旧パス上にあるログ バックアップ 3 の終了時点まで復元することが可能です。
古いパスから新しいパスまでロールフォワードすることによって、前の状態を再現するには
SQL Server データベース エンジンでは、矛盾する複数のバックアップが 1 つの復元シーケンスに使用されないように (それぞれ異なる復旧パスをたどってロールフォワードが行われないように) 制御されます。これによって、復旧後のデータベースの一貫性が維持されます。
以前の状態を復元する際、新しい復旧パスに従ってロールフォワードする場合は、復旧ポイント前のバックアップ、および復旧ポイント後のバックアップについて、復元シーケンスをそれぞれ別個に設ける必要があります。
- 新しい復旧パスの開始位置である復旧ポイントより前に作成したバックアップを復元します。その復旧ポイントを含んでいるバックアップは除外します。
- 新しい復旧パスに従ってロールフォワードします。つまり、復旧パスの生成以降に作成したバックアップを復元します。
たとえば、上の図で作成されるバックアップで、ログ バックアップ 3 は午前 10 時から午前 11 時までを対象としているものします。特定の時点への復元が、STOPAT**=10:**30 を指定して実行されました。これにより復旧パスが分岐し、新しい復旧ブランチが開始しました。これが ブランチ 2 となります。新しいブランチの最初のログ バックアップであるログ バックアップ 5 には、ログ バックアップ 3 と同じ先頭 LSN が含まれており、これが、現在は使用していないログ バックアップ 3 を置き換えています。新しい復旧パスでバックアップを復元する場合 (ブランチ 1 で開始してブランチ 2 で終了する場合)、復元シーケンスは、データベースの完全バックアップ、ログ バックアップ 1、ログ バックアップ 2、ログ バックアップ 5、ログ バックアップ 6 の順序です。
復旧分岐の管理
復旧ブランチは、同じ 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 が異なる複数の復旧分岐でどのように再利用されているか、確認してください。
復旧分岐を超えて複数のバックアップを復元シーケンスに組み込む必要のある場合は、使用するバックアップが正しい復旧パスをたどって復旧ポイントに達するように、復元シーケンスを構成する必要があります。そのためには、バックアップに backupset.first_recovery_fork_guid と backupset.last_recovery_fork_guid を追加します。これによって、バックアップが正しくリンクされ、適切な分岐をたどって復旧されるようになります。
backupset 履歴テーブルの値から、どのバックアップ セットを使用すればよいかを次のように判断できます。
- シーケンス内の各ログ バックアップを復元するには、first_recovery_fork_guid が、そのシーケンスの前のバックアップの last_recovery_fork_guid と同等である必要があります。
- データ バックアップおよび差分バックアップもリンクする必要があります。
ログ バックアップに、分岐ポイントと、データベースの完全バックアップまたは差分バックアップの最終 LSN が両方とも含まれている場合、リンク テストの結果は、分岐ポイントを基準とする最終 LSN の相対位置によって左右されます。
リンク テストは、backupset の値を使用して次のように行われます。- last_lsn が fork_point_lsn 以下の場合、データ バックアップまたは差分バックアップの last_recovery_fork_guid は、ログ バックアップの first_recovery_fork_guid と同等である必要があります。次の図に、last_lsn が fork_point_lsn よりも小さい例を示します。
- last_lsn が fork_point_lsn より大きい場合、データ バックアップまたは差分バックアップの last_recovery_fork_guid は、ログ バックアップの last_recovery_fork_guid と同等である必要があります。次の図に、last_lsn が fork_point_lsn よりも大きい例を示します。
- last_lsn が fork_point_lsn 以下の場合、データ バックアップまたは差分バックアップの last_recovery_fork_guid は、ログ バックアップの first_recovery_fork_guid と同等である必要があります。次の図に、last_lsn が fork_point_lsn よりも小さい例を示します。
- 差分バックアップの場合は、backupset.differential_base_guid を使用して差分ベースを特定します。
差分がマルチベースで、backupset.differential_base_guid が NULL の場合は、backupfile.differential_base_guid を使用してファイル別に差分ベースを特定する必要があります。
参照
概念
バックアップと復元によるデータベースのコピー
復元シーケンスの計画と実行 (完全復旧モデル)
ログ シーケンス番号の概要
ログ シーケンス番号と復元プラン
差分バックアップの基になるバックアップ