先行書き込みトランザクション ログ
このトピックでは、データの変更をディスクに記録するときの先行書き込みトランザクション ログの役割について説明します。トランザクション ログの基本的な情報については、「トランザクション ログの概要」を参照してください。
SQL Server では、先行書き込みログ (WAL) を使用します。これにより、関連付けられているログ レコードより前にデータ変更がディスクに書き込まれることがなくなります。これにより、トランザクションの ACID プロパティが維持されます。トランザクションおよび ACID プロパティの詳細については、「トランザクション (データベース エンジン)」を参照してください。
先行書き込みログがどのように機能するのかを理解するには、変更されたデータがディスクに書き込まれるしくみを把握しておくことが重要です。SQL Server はバッファー キャッシュを保持し、データを取得する必要がある場合は、そのキャッシュの中へデータ ページを読み取ります。データ変更はディスクに対して直接行われるのではなく、バッファー キャッシュ内のページのコピーに対して行われます。この変更は、データベースにチェックポイントが発生するまではディスクに書き込まれません。変更がディスクに書き込まれると、新しいページの保持にバッファーを使用できるようになります。変更されたデータ ページをバッファー キャッシュからディスクに書き込むことを "ページのフラッシュ" といいます。キャッシュ内で変更され、まだディスクに書き込まれていないページはダーティ ページといいます。
バッファー内のページが変更された時点で、その変更を記録したログ レコードがログ キャッシュ内に作成されます。このログ レコードは、関連付けられているダーティ ページがバッファー キャッシュからディスクにフラッシュされる前にディスクに書き込まれる必要があります。ログ レコードが書き込まれる前にダーティ ページがフラッシュされた場合、ログ レコードがディスクに書き込まれる前にサーバーに障害が発生すると、ロールバックできない変更がダーティ ページによりディスク上に作成されます。SQL Server には、関連付けられているログ レコードが書き込まれる前にダーティ ページがフラッシュされないようにするロジックが備わっています。ログ レコードは、トランザクションがコミットされるときにディスクに書き込まれます。
注 |
---|
IDE ドライブや SATA ドライブのキャッシュ データは、ディスクに書き込まれる前に一部が内部メモリに書き込まれる場合があります。この場合、先行書き込みログが正常に機能しません。SQL Server が実行されているコンピューターでこの種類のディスクの 1 つを使用している場合は、enable_force_flush オプションを有効にする必要があります。 |