チェックポイントとログのアクティブな部分

チェックポイントにより、現在のデータベースのバッファ キャッシュのダーティ データ ページは、ディスクにフラッシュされます。チェックポイントを使用すると、データベースの完全復旧時に処理する必要があるログのアクティブな部分を最小限に抑えることができます。完全復旧時には、次の種類の操作が行われます。

  • システムが停止する前にディスクにフラッシュされていなかった変更のログ レコードがロールフォワードされます。

  • COMMIT または ROLLBACK のいずれのログ レコードもないトランザクションなど、不完全なトランザクションと関連のあるすべての変更がロールバックされます。

チェックポイント操作

チェックポイントにより、データベースで次の処理が実行されます。

  • チェックポイントの開始位置を示すレコードをログ ファイルに書き込みます。

  • チェックポイント用に記録された情報をチェックポイント ログ レコードのチェーンに格納します。

    チェックポイントで記録される情報の 1 つは、データベース全体を正常にロールバックするために必要な最初のログ レコードのログ シーケンス番号 (LSN) です。この LSN は、最小復旧 LSN (MinLSN) といいます。MinLSN は、次の LSN の最小値です。

    • チェックポイントの開始の LSN

    • 最も古いアクティブなトランザクションの開始の LSN

    • まだディストリビューション データベースに配信されていない、最も古いレプリケーション トランザクションの開始の LSN

    チェックポイント レコードには、データベースに変更を加えたすべてのアクティブなトランザクションの一覧も含まれます。

  • データベースで単純復旧モデルが使用されている場合、MinLSN より前にある領域を再利用するようにマークを付けます。

  • すべてのダーティ ログとダーティ データ ページをディスクに書き込みます。

  • チェックポイントの終了位置を示すレコードをログ ファイルに書き込みます。

  • このチェーンの開始の LSN をデータベース ブート ページに書き込みます。

チェックポイントが作成される動作

チェックポイントは次の状況で作成されます。

  • CHECKPOINT ステートメントが明示的に実行された場合。接続を確立するために、現在のデータベースでチェックポイントが作成されます。

  • データベースで最小ログ記録操作が実行された場合。たとえば、一括ログ復旧モデルを使用しているデータベースで一括コピー操作が実行された場合です。

  • ALTER DATABASE を使用して、データベース ファイルが追加または削除された場合。

  • SHUTDOWN ステートメント、または SQL Server (MSSQLSERVER) サービスを停止することによって、SQL Server のインスタンスが停止された場合。どちらの場合でも、SQL Server のインスタンスの各データベースでチェックポイントが作成されます。

  • データベースの復旧にかかる時間を短縮するために、SQL Server のインスタンスにより、各データベースで定期的に自動チェックポイントが作成されている場合。

  • データベースのバックアップが作成された場合。

  • データベースのシャットダウンが必要な動作が実行された場合。たとえば、AUTO_CLOSE が ON に設定されていて、データベースへの最後のユーザー接続が終了した場合、またはデータベースの再起動が必要なデータベース オプションが変更された場合です。

自動チェックポイント

SQL Server データベース エンジンにより、自動チェックポイントが作成されます。自動チェックポイントが作成される間隔は、使用されているログ領域の量と最後のチェックポイントが作成されてからの経過時間に基づいています。データベースにほとんど変更が加えられない場合、自動チェックポイントが作成される間隔は変化して長くなります。また、多くのデータが変更される場合、自動チェックポイントは頻繁に作成されます。

[復旧間隔] サーバー構成オプションを使用して、サーバー インスタンス上のすべてのデータベースの自動チェックポイントの間隔を計算します。このオプションでは、システムの再起動時にデータベース エンジンでデータベースの復旧に使用できる最長時間を指定します。データベース エンジンでは、復旧操作時に [復旧間隔] オプションで指定された時間内に処理できる推定ログ レコード数が算出されます。

自動チェックポイントの作成間隔は、復旧モデルによっても異なります。

  • データベースで完全復旧モデルまたは一括ログ復旧モデルを使用している場合、[復旧間隔] オプションで指定された時間内に処理できるとデータベース エンジンが算出したログ レコード数に達するたびに、自動チェックポイントが作成されます。

  • データベースで単純復旧モデルを使用している場合、ログ レコード数が次の 2 つの値のうち、小さい方の値に達するたびに自動チェックポイントが作成されます。

    • ログが全体の 70% に達したとき。

    • [復旧間隔] オプションで指定された時間内に処理できるとデータベース エンジンが推定したログ レコード数に達したとき。

復旧間隔の設定に関する詳細については、「復旧間隔を設定する方法 (SQL Server Management Studio)」を参照してください。

データベースで単純復旧モデルを使用している場合、自動チェックポイントにより、トランザクション ログの未使用のセクションが切り捨てられます。ただし、データベースで完全復旧モデルまたは一括ログ復旧モデルを使用している場合は、自動チェックポイントにより、ログが切り捨てられることはありません。詳細については、「トランザクション ログの切り捨て」を参照してください。

CHECKPOINT ステートメントでは、チェックポイントが終了するまでの時間を秒単位で指定する checkpoint_duration 引数が使用できるようになりました。この引数は省略可能です。詳細については、「CHECKPOINT (Transact-SQL)」を参照してください。

アクティブなログ

ログ ファイルの MinLSN から最後に書き込まれたログ レコードまでのセクションを、ログのアクティブな部分 (アクティブなログ) と呼びます。これは、データベースの完全復旧を実行するのに必要なログのセクションです。アクティブなログはどの部分も切り捨てることができません。すべてのログ レコードは、MinLSN より前にあるログの部分から切り離す必要があります。

下図に、2 つのアクティブなトランザクションがあるトランザクション ログの末尾を単純化したものを示します。チェックポイント レコードは単一のレコードに圧縮されています。

アクティブなトランザクションがあるトランザクション ログの末尾

LSN 148 はトランザクション ログの最後のレコードです。LSN 147 に記録されたチェックポイントが処理された時点では、Tran 1 は既にコミットされており、Tran 2 だけがアクティブなトランザクションでした。このため、Tran 2 の最初のログ レコードが、前回のチェックポイントの時点でアクティブなトランザクションの最も古いログ レコードになります。したがって LSN 142、つまり Tran 2 の Begin トランザクション レコードが MinLSN になります。

実行時間の長いトランザクション

アクティブなログには、コミットされていないすべてのトランザクションのあらゆる部分が含まれている必要があります。トランザクションを開始したアプリケーションによりトランザクションがコミットまたはロールバックされないと、データベース エンジンでは MinLSN を進めることができません。このことが原因で、次の 2 つの問題が発生します。

  • トランザクションにより多くの変更が加えられ、これをコミットせずにシステムをシャットダウンした場合、次にシステムを再起動したときの復旧フェーズは [復旧間隔] オプションで指定した時間よりもかなり長くかかることがあります。

  • ログは MinLSN を超えた位置で切り捨てることができないので、ログのサイズが非常に大きくなることがあります。この現象は、自動チェックポイントのたびに通常はトランザクション ログが切り捨てられる単純復旧モデルをデータベースで使用している場合でも発生します。

レプリケーションのトランザクション

ログ リーダー エージェントは、トランザクション レプリケーション用に構成した各データベースのトランザクション ログを監視し、レプリケーションのマークが付けられたトランザクションをトランザクション ログからディストリビューション データベースにコピーします。アクティブなログには、レプリケーション用にマークされていて、まだディストリビューション データベースに配信されていないすべてのトランザクションが含まれている必要があります。これらのトランザクションが時間どおりにレプリケートされない場合、そのことが原因でログを切り捨てられなくなる場合もあります。詳細については、「トランザクション レプリケーションの動作方法」を参照してください。