不動の鳥の勉強記録

時間があるときに勉強したことをメモします。

SQL Serverの仮想ログファイル(VLF)の数が多くなりすぎたときの対応

■はじめに

いままでSQL Serverを運用してて気が付かなったことに先日気が付いたので記事にまとめたいと思います。 ログファイルの容量などはいままで監視していたのですが、仮想ログファイル(VLF)の数が多すぎるという見たことがないアラートを検知したので何だろうと調べました。

■仮想ログファイル(VLF)とは

単語だけで調べるとマイクロソフト社の下記ページがヒットします。

docs.microsoft.com

仮想ログファイル(VLF)とは、上記サイトの中ほどにある「トランザクション ログの物理アーキテクチャ」に記載されていました。

  • 物理ファイルは内部的に多くの仮想ログファイル(VLF)に分割されていること
  • ログファイルの作成時や拡張時にデータベースエンジンにより動的に選択されること
  • 管理者が仮想ログファイルのサイズや数を構成または設定できない

という性質のファイルです。注意には仮想ログファイルの数の増え方が記載されています。これをみると自動拡張サイズが1MBなどの初期の自動拡張サイズにしたまま、自動拡張をさせ続けると仮想ログファイル数が尋常じゃない数になりそうです。さらに注意点としては

このような状況では、データベースの起動、ログのバックアップ操作、およびログの復元操作の速度が低下する場合があります。

と記載されていることは新発見でした。普段常に動かし続けているうえでは、定期的なログのバックアップは必須なため対策が必要と感じました。

■仮想ログファイル数の減らし方

下記サイトが参考になります。

blogs.msdn.microsoft.com

ページ中ほどにある「対処」に対応方法が記載されています。
簡単にまとめると、

  1. ログファイルをシュリンクして圧縮する。
  2. 適切なファイルサイズまで明示的に拡張する。

となります。試しにアラートが出ていたデータベースに対して対処をやってみたところ、確かにファイル数が激減したことを確認しました。仮想ログファイルの数が尋常じゃないデータベースは、自動拡張のサイズも規定値(1MBの自動拡張サイズ)だったりするので、今後同様のことが発生しないよう自動拡張ファイルのサイズも変更しておくとよいです。

トランザクションログの自動拡張サイズについての、マイクロソフト社のベストプラクティスは、1,024MB以下とすることなのでそれ以上にせず丁度良い時間に設定するのがよいです。具体的にどのようなサイズに設定すればよいかは次のスクリプトを実行すると結果が返ってきますので参考にしてみてはいかがでしょうか。

github.com

■終わりに

いままで見ていないアラートを検知したので調査してみました。これ以外にも実は見ないといけない項目が潜んでいそうなので継続的に勉強しなきゃいけないなと感じました。