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

トランザクション ログ ファイルに不要な未使用領域が含まれていることがわかっている場合は、トランザクション ログのサイズを縮小することで未使用領域を再利用できます。このプロセスは、ログ ファイルの圧縮と呼ばれます。

圧縮を実行できるのは、データベースがオンラインで、1 つ以上の仮想ログ ファイルが解放されている間だけです。場合によっては、次のログの切り捨てまでログを圧縮できないことがあります。

注意

通常、ログの切り捨ては、単純復旧モデルではデータベースのバックアップ時に、完全復旧モデルではトランザクション ログのバックアップ時に自動的に行われます。ただし、さまざまな要因で遅延が発生する場合があります。詳細については、「ログの切り捨てが遅れる原因となる要因」を参照してください。

データベース ファイルを圧縮せずにログ ファイルを圧縮するには

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

To monitor log space

注意

データベースおよびログ ファイルの圧縮は、自動的に行われるように設定できます。ただし、自動圧縮は推奨されず、autoshrink データベース プロパティは既定で FALSE に設定されています。autoshrink を TRUE に設定すると、ファイル領域の 25% を超える領域が未使用の場合にのみ、自動圧縮によってファイルのサイズが縮小されます。ファイルは、ファイル領域の 25% のみが未使用領域になるサイズ、またはファイルの元のサイズの、どちらか大きい方のサイズまで圧縮されます。autoshrink プロパティの設定の変更については、「データベースのプロパティを表示または変更する方法 (SQL Server Management Studio)」([オプション] ページの [自動圧縮] プロパティを使用する場合) または「ALTER DATABASE の SET オプション (Transact-SQL)」(AUTO_SHRINK オプションを使用する場合) を参照してください。

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

トランザクション ログを圧縮すると、1 つ以上の非アクティブな仮想ログ ファイルを削除することにより、トランザクション ログの物理サイズが削減されます。ログ ファイルのサイズは、常に仮想ログ ファイル単位で縮小されます。たとえば、600 MB のログ ファイルを 100 MB の 6 つの仮想ログに分割している場合、ログ ファイルのサイズは 100 MB ずつしか縮小できません。このファイルのサイズは 500 MB や 400 MB などに縮小することはできますが、433 MB や 525 MB などのサイズに縮小することはできません。アクティブなログ レコードを保持する仮想ログ ファイル (アクティブな仮想ログ ファイル) は、論理ログの一部なので削除できません。詳細については、「トランザクション ログの物理アーキテクチャ」を参照してください。

注意

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

ログ ファイルの現在のサイズは、仮想ログ ファイルによって使用されるページの合計サイズと同じです。ただし、これらのページは、ログ ファイルによって使用されません。論理ログ部分を保持している仮想ログ ファイルは解放できません。ログ ファイルのすべての仮想ログ ファイルが論理ログ部分を保持している場合、そのログ ファイルは圧縮できません。圧縮は、ログの切り捨てにより 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 で終了する論理ログがあるとします (目標サイズは仮想ログ 3 までのサイズの 4 分の 3 に相当します)。

圧縮前の 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 は解放され、物理ログ ファイルのサイズは要求したサイズまで縮小されます。

注意

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