ログ シーケンス番号と復元プラン

 このトピックは、完全復旧モデルを使用する SQL Server データベースに適用されます。

復元プランの場合、最も重要なログ シーケンス番号 (LSN) は最初と最後の LSN です。これらの LSN は、次の場所から取得できます。

  • msdb 内の backupset テーブル。列の名前は first_lsn および last_lsn です。

  • RESTORE HEADERONLY ステートメント。列の名前は FirstLSN および LastLSN です。

次の表では、さまざまなバックアップで使用されるこれらの用語を定義します。

用語

定義

first_lsn または FirstLSN

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

データ バックアップと差分バックアップの場合、最初の LSN によって、このバックアップで復旧を実行するのに必要な最も古いログ レコードが識別されます。

ログ バックアップの場合、最初の LSN によって、バックアップに含まれている最初のログ レコードが識別されます。

last_lsn または LastLSN

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

最後の LSN によって、最後のバックアップの次のログ レコードが識別されます。データ バックアップと差分バックアップの場合 (および一括ログ操作を含むログ バックアップの場合)、少なくともこの LSN までロールフォワードされる必要があります。この LSN までロールフォワードされないと、復元中にコピーされたデータの一貫性がなくなります。

ログ バックアップの場合、ログ バックアップにはこの LSN の前までのログ レコードが含まれます (この LSN は含まれません)。

ログ シーケンス番号およびデータ バックアップまたは差分バックアップ

データ バックアップと差分バックアップの場合、first_lsnlast_lsn の間のログ データがバックアップに含まれます。これにより、ログ バックアップを last_lsn に復元しなくてもバックアップを使用できます。

データ バックアップまたは差分バックアップの場合、バックアップを復元シーケンスで使用するときは last_lsn が使用可能な最も古い復旧ポイントになります。これよりも前の復旧ポイントが必要な場合は、これよりも前のバックアップを使用する必要があります。

データ バックアップまたは差分バックアップの復元後、ロールフォワードに使用するログ バックアップを計画するときは、通常、データ バックアップまたは差分バックアップ後の最初のログ バックアップから開始します。バックアップのプロパティを調べると、first_lsn がデータ バックアップまたは差分バックアップの last_lsn 以下であり、last_lsn がデータ バックアップまたは差分ログ バックアップの last_lsn を上回るログ バックアップがあることがわかります。

ログ シーケンス番号およびログ チェーン内のログ バックアップ

新しいログ チェーンは、データベース作成後の最初の完全バックアップ時、または単純復旧モデルから完全復旧モデルや一括ログ復旧モデルに切り替えた後に開始します。チェーン内の最初のログ バックアップでは、backupset.begins_log_chain = 1 です。

first_lsnlast_lsn は、連続するシーケンス (ログ チェーン) にログ バックアップを結び付けるために使用します。一連の連続するログ バックアップを使用して、最新のデータ バックアップや差分バックアップから、または見つからないか破損しているデータ バックアップや差分バックアップ以降のできるだけ古いバックアップから、データベースをロールフォワードできます。

ログ バックアップでは、first_lsn はバックアップ内の最初のログ レコードの LSN です。ログ バックアップには、このログ レコードから始まって、LSN が last_lsn であるログ レコードの前までのログ レコードが含まれます。以前のバックアップ (Backup_A) の最後のログ レコードの LSN が、その後のバックアップ (Backup_B) の最初のログ レコードの LSN 以上である場合のみ、2 つのログ バックアップは連続します。つまり、Backup_A.last_lsn >= Backup_B.first_lsn です。この公式に当てはまらない場合、2 つのバックアップ間にはギャップがあります。

これらの LSN 間の関係の重要性は、次のとおりです。

  • A.last_lsn = B.first_lsn

    A.last_lsn = B.first_lsn の場合、通常、B は A の直後に行われたログ バックアップです。

    この関係を次の図に示します。ログ レコード n は、ログ バックアップ B で発生します。このログ レコードは、ログ バックアップ A では last_lsn として、ログ バックアップ B では first_lsn として記録されたことに注意してください。

    ログ バックアップ A の last_lsn とログ バックアップ B の first_lsn は等しい

  • A.last_lsn > B.first_lsn

    A.last_lsn > B.first_lsn の場合、オーバーラップが存在します。通常、オーバーラップは、コピーのみのログ バックアップ、または特定の時点への復旧後に行われた最初のログ バックアップが原因で発生します。オーバーラップはさまざまな復旧分岐に関連することがあります。詳細については、「復旧パス」を参照してください。

ログ チェーンの破損原因

通常は、SQL Server データベース エンジンが一連のログ バックアップにギャップが生じないように制御するため、ログ チェーンは途切れません。ただし、データベース管理者は、復旧モデルを単純復旧モデルに変更し、完全復旧モデルまたは一括ログ復旧モデルに戻すことで、ログ チェーンを破損させてしまう可能性があります。

単純復旧モデルが関与するような形で復旧モデルの切り替えを行った場合、ログ チェーンが破損しているため、ロールフォワードを実行できません。完全復旧モデルまたは一括ログ復旧モデルへの変更後、新しい差分ベースまたは差分ベースのセットを作成する必要があります。また、差分バックアップを使用してギャップを埋めることもできます。