SQL Server のログが小さくならない場合の対処法

概要

SQL Server のログ (ldf) を圧縮するには、 SQL Server Management Studio からデータベースを右クリックし「タスク」-「圧縮」-「データベース」や「ファイル」を実行します。しかし、ログの圧縮を実施しても、サイズが大きいままで小さくならない場合があります。

この問題は、復旧モデルが「完全」になっており、かつ、適切にバックアップがとられていない場合に発生します。解決するには、復旧モデルを「単純」にするか、ログのバックアップをとります。どちらを採用するかは、データベースの復旧モデルの選択などを確認してください。

方法1: 復旧モデル「単純」を利用

ログが小さくならないと悩んでいるような運用の場合、データベースの復旧モデルを「完全」から「単純」に変更するだけで十分なことが多いです。本当に復旧モデル「完全」が必要なのかどうか、 MSDN (SQL Server Books Online) を参照して決めてください。

復旧モデル「単純」に変更した後は、再度 DB の圧縮を行えばログサイズが小さくなります。 *1

方法2: ログのバックアップを利用して圧縮

データベースを右クリックし、「タスク」-「バックアップ」からバックアップの種類に「トランザクション ログ」を指定してバックアップを実行します。その後、ログを圧縮すればサイズが小さくなります。多少サイズが残る場合がありますが、理由はログの切り捨てが遅れる要因を参照してください。

なお、「WITH TRUNCATE_ONLY」の使用は推奨されていないので注意してください。せっかく復旧モデルを「完全」にしているので、「WITH TRUNCATE_ONLY」なんて変な方法を使わず、ログの連続性を保証するように素直にバックアップをとりましょう。

補足

ログ レコードがアクティブなままになる要因は、 sys.databases カタログ ビューの log_reuse_wait 列と log_reuse_wait_desc 列を確認すればわかることがあります。

SELECT
  name
  , log_reuse_wait
  , log_reuse_wait_desc 
FROM
  sys.databases

より詳しくは、トランザクション ログの理解と管理を参照してください。

*1:おちゃらけ運用なら、この後に復旧モデルを「完全」に変更しても OK です :-p