トランザクション ログの圧縮

トランザクション ログの物理サイズを削減するには、ログ ファイルを圧縮する必要があります。トランザクション ログを圧縮すると、1 つ以上の非アクティブな仮想ログ ファイルを削除することにより、トランザクション ログの物理サイズが削減されます。アクティブなログ レコードを保持する仮想ログ ファイル (アクティブな仮想ログ ファイル) は、論理ログの一部なので削除できません。仮想ログ ファイルの詳細については、「トランザクション ログの物理アーキテクチャ」を参照してください。

ms178037.note(ja-jp,SQL.90).gifメモ :
最近トランザクション ログが切り捨てられていない場合は、ログが切り捨てられるまでログを圧縮できない場合があります。詳細については、「ログの切り捨てが遅れる要因」を参照してください。

ログ ファイルの圧縮のしくみ

ログ ファイルのサイズは、仮想ログ ファイル単位で縮小されます。たとえば、600 MB のログ ファイルを 100 MB の 6 つの仮想ログに分割している場合、ログ ファイルのサイズは 100 MB ずつしか縮小できません。このファイルのサイズは 500 MB や 400 MB などに縮小することはできますが、433 MB や 525 MB などのサイズに縮小することはできません。

ms178037.note(ja-jp,SQL.90).gifメモ :
データベース エンジンでは、ログ ファイルの作成時または拡張時に仮想ログ ファイルのサイズを動的に選択します。詳細については、「トランザクション ログの物理アーキテクチャ」を参照してください。

ログ ファイルの現在のサイズは、仮想ログ ファイルによって使用されるページのサイズと同じです。論理ログ部分を保持している仮想ログ ファイルは解放できません。ログ ファイルのすべての仮想ログ ファイルが論理ログ部分を保持している場合、そのログ ファイルは圧縮できません。圧縮は、ログの切り捨てにより 1 つ以上の仮想ログ ファイルが非アクティブとしてマークされるまで実行できません。

ファイルの圧縮操作では、非アクティブな仮想ログ ファイルだけを削除できます。目標サイズを指定せずにファイルの圧縮操作を実行すると、すべての非アクティブな仮想ログ ファイルが削除されます。目標サイズを指定してファイルの圧縮操作を実行すると、非アクティブな仮想ログ ファイルが、目標サイズに近いサイズ (目標サイズを下回らない程度) にするのに必要な分だけ削除されます。通常、圧縮後のログ ファイルは目標サイズよりもやや大きくなりますが、目標サイズよりも小さくなることはありません。仮想ログ ファイルを使用するので、ログ ファイルの実際の圧縮率を予想するのは困難です。

ファイルを圧縮するとき、解放される領域は、ファイルの末尾にある領域でなければなりません。トランザクション ログ ファイルを圧縮すると、ユーザーが要求したサイズまでログ ファイルを縮小するために必要な数の仮想ログ ファイルがログ ファイルの末尾から解放されます。ユーザーが指定した target_size は、次の最も高い仮想ログ ファイル境界に丸められます。たとえば、上記で例示した 100 MB の仮想ログ ファイル 6 つを含む 600 MB のファイルに対し、ユーザーが target_size に 325 MB を指定すると、最後の 2 つの仮想ログ ファイルが削除され、新しいファイル サイズは 400 MB になります。

DBCC SHRINKDATABASE 操作または DBCC SHRINKFILE 操作では、物理ログ ファイルを要求したサイズに圧縮する操作がすぐに試行されます。

  • 仮想ログ ファイル内の target_size マークを超えた場所に論理ログ部分がない場合、target_size マークより後の仮想ログ ファイルが解放され、DBCC ステートメントはメッセージなしで正常に完了します。

仮想ログ内の target_size マークを超えた場所に論理ログ部分がある場合は、SQL Server データベース エンジンにより、できるだけ多くの領域が解放され、情報メッセージが表示されます。このメッセージには、ファイル末尾の仮想ログから論理ログを削除するために実行する必要がある操作が示されます。この操作を実行すると、DBCC ステートメントを再実行して必要な領域を解放できます。

たとえば、DBCC SHRINKFILE ステートメントを 275 MB の target_size で実行したときに、6 つの仮想ログ ファイルを保持する 600 MB のログ ファイルに、仮想ログ ファイル 3 で始まって仮想ログ ファイル 4 で終了する論理ログがあるとします。

圧縮前の 6 つの仮想ログ ファイルを保持するログ ファイル

仮想ログ ファイル 5 と 6 は、論理ログ部分を含んでいないのですぐに解放されます。ただし、指定した target_size を満たすには、仮想ログ ファイル 4 も解放される必要がありますが、論理ログ ファイルの終了部分が保持されているので解放できません。仮想ログ ファイル 5 と 6 の解放後、データベース エンジンにより、仮想ログ ファイル 4 の残りの部分にダミー レコードが書き込まれます。これにより、ログ ファイルの終わりが仮想ログ ファイル 1 の終わりになります。大部分のシステムでは、仮想ログ ファイル 4 で始まるすべてのトランザクションが数秒でコミットされます。つまり、ログのアクティブな部分全体が仮想ログ ファイル 1 に移動します。これで、ログ ファイルは次のようになりました。

4 つの仮想ファイルに縮小されるログ ファイル

DBCC SHRINKFILE ステートメントでも、要求されたすべての領域を解放できなかったことと、BACKUP LOG ステートメントを実行して残りの領域を解放できることを示す情報メッセージが表示されます。ログのアクティブな部分が仮想ログ ファイル 1 に移動した後、次のように、BACKUP LOG ステートメントにより、仮想ログ ファイル 4 にある論理ログ全体が切り捨てられます。

ログ切り捨て後のログ ファイル

仮想ログ ファイル 4 には論理ログ部分が含まれなくなったので、同じ DBCC SHRINKFILE ステートメントを 275 MB の target_size で実行できるようになります。仮想ログ ファイル 4 は解放され、物理ログ ファイルのサイズは要求したサイズまで縮小されます。

ms178037.note(ja-jp,SQL.90).gifメモ :
実行時間が長いトランザクションなど、特定の要因によって仮想ログ ファイルが長期間アクティブのままになる場合があります。これによりログの圧縮が制限されたり、ログがまったく圧縮されない可能性があります。詳細については、「ログの切り捨てが遅れる要因」を参照してください。

ログが圧縮される状況

ログの圧縮は、データベースがオンラインのときに実行できます。次のような状況では、ログ ファイルのサイズが物理的に縮小されます。

  • 自動圧縮操作の発生時
  • ログ ファイルを参照する DBCC SHRINKFILE ステートメントの実行時
  • DBCC SHRINKDATABASE ステートメントの実行時

ログ ファイルを圧縮するには

ログ ファイルの圧縮イベントを監視するには

ログ領域の使用量を監視するには

参照

概念

満杯になったトランザクション ログのトラブルシューティング (エラー 9002)
データベース オプションの設定
トランザクション ログのバックアップ
トランザクション ログの切り捨て

その他の技術情報

BACKUP (Transact-SQL)
DBCC SHRINKDATABASE (Transact-SQL)
DBCC SHRINKFILE (Transact-SQL)
領域の割り当てと再利用

ヘルプおよび情報

SQL Server 2005 の参考資料の入手