SQL

ログの圧縮

データベースの復旧モデルにはFULL, BULK_LOGGED, SIMPLEの3つがあります。SIMPLEの場合、データのバックアップを取るとログ領域は自動的に縮小して再利用できるようになりますが、SIMPLE以外の場合はログのバックアップを取らない限りログは切り捨てられず、貯まる一方です。

復旧モデルは「sp_helpdb」で確認することができます。結果セットの「status」列に「Recovery=***」と出力されます。

    exec sp_helpdb 'DatabaseName'

復旧モデルがFULLの場合、通常は長めの間隔で定期的にフル バックアップを行って、もう少し短い間隔でログのバックアップを取るようです。例えば1日1回フル バックアップを行い、1時間ごとにログのバックアップを取るといった具合です。

しかし、復旧モデルがFULLであるにもかかわらずログのバックアップを取らないで、常にフル バックアップすることもあるようです。恐らく設定を間違えているのだと思いますが、私の借りていたレンタル サーバは事実そうなっていました。恐らく、データベースを使うたびにログが増え続け、たちまちサーバ資源を使い果たしてしまうでしょう。ログを切り捨てることはできないでしょうか。そもそも、常にフル バックアップを取っていてログのバックアップを使用しないなら、ログ領域は無駄になっていますね。

まず、ログの圧縮には次のコマンドを使います。

    dbcc shrinkfile(LogFileName)

ただ、このコマンドはデータベース ファイルの空き領域を捨ててデータベース ファイルを縮小するコマンドで、使用中のログ領域を切り捨てることはできません。ログ領域を切り捨てるには擬似的にバックアップ コマンドを行います。

    backup log DatabaseName with truncate_only

「with truncate_only」はバックアップ コピーを取らずにログを切り捨てるオプションです。無論、本当にバックアップをファイルに保存してもかまわないのですが、上述のような状況の場合、バックアップ ファイルの使い道はないと思います。常にフル バックアップがとってあるのですから。

結局、2つのコマンドを続けて実行すれば、領域を切り捨ててログを縮小できます。

    backup log DatabaseName with truncate_only
    dbcc shrinkfile(LogFileName)

それから、データベース ファイルを確認するストアド・プロシージャとコマンドをいくつかメモしておきます。

    exec sp_helpfile		-- データベース ファイルの確認
    dbcc showfilestats		-- データ領域の確認
    dbcc sqlperf(logspace)	-- ログ領域の確認

「dbcc showfilestats」はヘルプにも載っていない怪しいコマンドです。結果セットの「TotalExtents」と「UsedExtents」は64KB単位のようで、64をかけてKB単位に直すことができます。

「dbcc splperf(logspace)」の結果セットの「Log Size (MB)」は8KB少ないような気がしますが、使用されているログ領域のサイズは「[Log Size (MB)] * [Log Space Used (%)] / 100」で良いと思います。

(2007/11/30 初稿)