SQL Server でのバックアップの復元と復旧の動作について

このトピックは、すべての SQL Server データベースに関連しています。

復元は、バックアップからデータをコピーし、ログ記録されたトランザクションをこのコピーしたデータに適用して、目的の復旧ポイントにロールフォワードする処理を指します。データ バックアップまたは差分バックアップには、アクティブなトランザクションを各バックアップの復元の一部としてロールフォワードするのに十分なトランザクション ログ レコードが含まれます。データベースは、コミットされていないトランザクションをロールバックすることによって、トランザクション的に一貫性のある使用可能な状態にする必要がありますが、各バックアップには、そのために十分なログも含まれます。コミットされていないトランザクションがある場合に、そのトランザクションをロールフォワードし、データベースをオンラインにする処理は、復旧と呼ばれます。

ロールフォワード セット

ログに記録された変更をデータベース内のデータに適用し、データを時間的に進んだ状態にすることをロールフォワードと呼びます。復元対象のすべてのデータのセットをロールフォワード セットと呼びます。ロールフォワード セットは、データベースのバックアップや部分バックアップ、またはファイル バックアップのセットなど、1 つ以上の完全バックアップを復元することで定義されます。RESTORE ステートメントに、ファイル グループ、ファイル、またはページが指定されている場合は、指定されているアイテムのみがロールフォワード セットに含まれます。指定のない場合は、復元対象のバックアップ内のすべてのファイルが、ロールフォワード セットに含まれます。完全バックアップにログ レコードが含まれている場合は、このログを使用して、復元されたデータがロールフォワードされます。

注意

復元時にファイル グループを指定した場合は、ファイル グループ全体が現在の状態に復元されます。この復元には、バックアップが行われてからこのファイル グループに追加されたファイルも含まれます。詳細については、「ロールフォワード中の追加ファイル作成の管理」を参照してください。

差分バックアップの場合は、差分ベースが作成されてからデータベースにファイルが追加されていた場合、差分バックアップを復元すると、ロールフォワード セット内のページが差分バックアップのデータで上書きされる可能性があります。詳細については、「差分バックアップの使用」を参照してください。

差分バックアップを復元した場合にページが更新されるのは、ページがロールフォワード セット内にあり、かつバックアップ自体にも含まれていて、RESTORE ステートメントにページまたはこのページのファイルが指定されているか、ファイルやページがまったく指定されていない場合のみです。

完全復旧モデルと一括ログ復旧モデルでは、ログは個別にバックアップされます。通常は、データ バックアップと (必要であれば) 差分バックアップの復元後に、これらのバックアップ以降に作成されたログ バックアップを復元し、データベースを障害発生の直前の状態に戻します。ログ バックアップを復元した場合は、ロールフォワード セット内のページがすべてロールフォワードされます。ログ バックアップの詳細については、「トランザクション ログのバックアップ」を参照してください。

復元シーケンス

各復元シナリオは、復元シーケンスと呼ばれる 1 つ以上の復元手順 (操作) を使用して実装されます。各操作は、個別の Transact-SQL RESTORE ステートメントに対応しています。復元シーケンスでは、復元の 1 つ以上のフェーズによって、影響のあるデータが移動されます。

Transact-SQL 復元シーケンスとその構築方法の詳細については、「SQL Server データベースの復元シーケンスの処理」を参照してください。

復元のフェーズ

復元は、複数のフェーズから成る処理です。復元フェーズには、データのコピー フェーズ、再実行 (ロールフォワード) フェーズ、元に戻す (ロールバック) フェーズなどがあります。

  • データのコピー フェーズでは、すべてのデータ、ログ、およびインデックス ページが、データベースのバックアップ メディアからデータベース ファイルにコピーされます。

  • 再実行 (ロールフォワード) フェーズでは、バックアップからコピーされたデータにログ記録されているトランザクションが適用され、データが復旧ポイントにロールフォワードされます。通常、この復旧ポイントにはデータベースにコミットされていないトランザクションがあるので、データベースは使用できない状態です。このような場合は、データベースの復旧処理の一環として、元に戻すフェーズが必要になります。

  • 復旧の最初の段階である元に戻すフェーズでは、コミットされていないトランザクションがロールバックされ、ユーザーがデータベースを使用できる状態にします。このロールバック フェーズが完了すると、これ以降のバックアップは復元できなくなります。

このセクションの残りの部分では、上記の各フェーズをさらに詳しく説明します。

データのコピー フェーズ

どの復元処理でも、データのコピー フェーズが最初のフェーズになります。データのコピー フェーズでは、復元対象のデータベース、ファイル、またはページの内容が初期化されます。このフェーズは、完全バックアップか差分バックアップを使用して、データベース、ファイル、またはページの復元操作により、実行されます。

データのコピー フェーズでは、1 つ以上の完全バックアップと、必要に応じて差分バックアップから、データをコピーします。その後、影響を受けるデータベース、ファイル、またはページの内容を、これらのバックアップでキャプチャされた時点に戻します。

ロールフォワード セット内で最も古いファイルまたはページを基に、次の再実行 (ロールフォワード) フェーズの開始点が決められます。

再実行 (ロールフォワード) フェーズ

再実行 (またはロールフォワード) は、ロールフォワード セット内のデータに対してログ記録された変更を再実行し、データを適切な時点の状態に戻します。SQL Server データベース エンジンは、完全バックアップに含まれているログから始めて、ログ バックアップの復元中にこれらを処理して、ロールフォワードを行います。

復元では、不要なロールフォワードは行われません。通常、データがバックアップ時に読み取り専用であり、それ以降も読み取り専用のままであった場合、ロールフォワードは必要ないため、省略されます。

復旧ポイント

ロールフォワードの目的は、データを元の復旧ポイント時の状態に戻すことです。復旧ポイントは、一連のデータを復旧する目標の時点としてユーザーが指定したポイントです。完全復旧モデルでは、特定の時点、マークされたトランザクション、またはログ シーケンス番号を復旧ポイントとして指定できます。一括ログ復旧モデルでは、前回のログ バックアップ以降一括操作を行っていない場合に限り、特定の時点への復旧が可能です。

再実行の一貫性

再実行フェーズでは、データは常に復旧ポイントにおけるデータベースの状態との再実行の一貫性がある時点にロールフォワードされます。すべてのデータは、元に戻す操作を行える時点までロールフォワードされています。

データベースの状態は、次のようにプライマリ ファイルによって定義されます。

  • プライマリ ファイルが復元される場合、復旧ポイントによってデータベース全体の状態が決まります。たとえば、テーブルが誤って削除された直前の時点にデータベースを復旧する場合は、データベース全体をその時点の状態に復元する必要があります。

  • プライマリ ファイルが復元されない場合、データベースの状態は既知であり、復元されたデータは、データベースとトランザクション的に一貫性のある復旧ポイントまでロールフォワードされます。この動作は、SQL Server によって強制的に行われます。

ただし、データベースには、復旧ポイントの時点でコミットされていないトランザクションによる変更が含まれている可能性があります。オンライン復元の場合は、データは、データベースのオンラインになっている部分の最新状態と一貫性のある時点に復旧されます。

差分バックアップの場合は、差分バックアップが作成された時点までスキップされます。ロールフォワード セット内のページで、差分バックアップに新しいページがある場合は、新しいページで上書きされます。

元に戻す (ロールバック) フェーズおよび復旧

再実行フェーズですべてのログ トランザクションをロールフォワードした後、通常、データベースには復旧ポイントでコミットされていないトランザクションによる変更が含まれます。このコミットされていないトランザクションにより、ロールフォワードされたデータのトランザクション的な一貫性が損なわれます。復旧処理は、トランザクション ログを開いてコミットされていないトランザクションを特定します。コミットされていないトランザクションは、トランザクション的に一貫性のないデータが他のトランザクションによって表示されないようにするためのロックを保持していない限り、ロールバックによって元に戻されます。この手順を、元に戻す (ロールバック) フェーズと呼びます。復旧処理の開始時点で既にそのデータにトランザクション的な一貫性がある場合、元に戻すフェーズはスキップされます。データベースのトランザクション的な一貫性が確保されると、そのデータベースはオンラインになります。

通常、1 つ以上のバックアップが復元された後は、復旧には再実行と元に戻すフェーズの両方が含まれています。各完全バックアップおよび差分バックアップには、バックアップ内のデータ自体が一貫性のある状態に復旧できるだけの十分なトランザクション ログ レコードが含まれています。

注意

SQL Server 2005 Enterprise Edition 以降のバージョンでは、クラッシュ復旧またはデータベース ミラーリングのフェールオーバー中、元に戻すフェーズの間に、ユーザーはデータベースにアクセスできます。これは、高速復旧と呼ばれます。これは、クラッシュの発生時にコミットされていなかったトランザクションが、クラッシュ前に保持していたロックを再度取得することで実現されます。トランザクションのロールバック処理が進行する間、このロックにより、ユーザーの介入を防ぐことができます。

RECOVERY オプションおよび NORECOVERY オプションと復元フェーズの関係

次に示すように、個々の RESTORE ステートメントは、WITH NORECOVERY を指定したかどうかによって、再実行フェーズ後に終了される場合と、元に戻すフェーズまで続行される場合があります。

  • WITH RECOVERY には、再実行フェーズと元に戻すフェーズの両方が含まれており、これを使用するとデータベースが復旧されます。追加で他のバックアップを復元することはできません。これは既定の処理です。

    ロールフォワード セットがデータベースと一貫性がある時点までロールフォワードされていない場合、元に戻すフェーズは行われません。この場合、データベース エンジンによりエラーが生成され、復旧は停止します。

    ロールフォワード セット全体がデータベースと一貫性がある場合は、復旧が実行され、データベースがオンラインになります。

  • WITH NORECOVERY を使用すると、コミットされていないトランザクションを保護するために、元に戻すフェーズが省略されます。元に戻すフェーズを省略することで、他のバックアップを復元し、さらに適切な時点へデータベースをロールフォワードすることが可能になります。場合によっては、RESTORE WITH NORECOVERY を実行すると、データベースと一貫性がある時点までデータがロールフォワードされます。このような場合、RECOVERY オプションを使用してロールフォワード セットを復旧できることを通知する情報メッセージが、データベース エンジンによって生成されます。

    ロールフォワード セットの詳細については、「SQL Server でのバックアップの復元と復旧の動作について」を参照してください。

注意

3 番目のオプションである WITH STANDBY は、このトピックの対象外です。

これらの RESTORE オプションの詳細については、「RESTORE (Transact-SQL)」を参照してください。

復旧パス

復旧パスは、ある期間にわたって一貫性を確保しながら、データベースが更新されてきた変遷状態を表すもので、各データベースに固有のものです。復旧パスとこれに関連する復旧分岐および復旧ブランチの概念については、「復旧パス」を参照してください。