none
トランザクションログが、切り捨てと圧縮をしても小さくならない。 RRS feed

  • 質問

  • こんにちは。お世話になります。よろしくお願いします。

    SQL Server 2008 において、完全復旧モデルにしていたら、トランザクションログファイルが、240GBまでに膨らんでしまいました。
    ログのバックアップをManagement Studio で取る際、「トランザクション ログを切り捨てる」になっていることを確認し、実施しました。
    4時間近くかかって、ようやくログのバックアップが取れた後、DBCC Shrink File (2,truncateonly) (←2はログファイル) を実施しました。
    しかし、ファイルサイズが小さくなりません。Management Studioで、圧縮を行おうとするとフォームには、

    現在割り当てられている領域: 241679.50 MB
    使用可能な空き領域:      240016.22 MB (99%)

    と表示されます。けれども、圧縮アクションが「未使用領域を解放する」になっているのに、実行しても、ファイルサイズが一向に小さくなりません。
    何がいけないのでしょうか?
    2009年12月18日 4:43

回答

  • こんにちは、nagino です。

    > DBCC Shrink File (2,truncateonly)
    以下にあるとおり、truncateonly はデータファイルにのみ有効です。
    指定しても意味がありません。

    > 使用可能な空き領域:      240016.22 MB (99%)
    空きが 99% ですので、トランザクションログ自体の切捨ては行われています。
    トランザクションログファイルが、中にはわずかなログと大量の空き領域となっている状態です。
    今回初めてトランザクションログをメンテナンスされたのであれば、おそらくトランザクションログファイルの末尾にログが記録されてしまっていると思われます。
    空き領域がある状態(現在の状態)でダミーの SELECT 文を実行して、トランザクションログのバックアップを取得し、再度 DBCC Shrinkfile を実行してください。(スペースに注意)
    また、その際はターゲットのサイズを指定することをお勧めします。(ぎりぎりまで切り詰めると、再拡張時にパフォーマンスが劣化するため)
    例:DBCC ShrinkFile (2, 1024)



    以下ご参考まで。

    トランザクションログファイルは、全体で一つの大きな輪になっていると考えてください。
    ログを記録している際に、ファイルの終わりまで行くと、先頭に戻って記録を続けます。 (空きが無くなると、ファイルを拡張します。)

    一方で、空き領域の切捨ては、ファイルの末尾からしか行われません。

    そのため、最新のログがファイルの末尾にあると、切捨てが出来ません。
    その場合は、ダミーの SELECT 文で 最新のログをファイルの先頭に記録させ、末尾のログをバックアップすることで、切捨てが出来るようになります。


     
    MCITP(Database Developer/Database Administrator)
    • 回答としてマーク 尾画茶 2009年12月21日 2:06
    2009年12月20日 6:11

すべての返信

  • フルバックアップはとられましたか?

    SQL Server 2005 の知識レベルですが、、、基本は変わっていないと思うのでコメントさせていただきます。

    トランザクションログは、「フルバックアップ」を起点に それより古いものが削除可能になります。

     1) データベース作成当初
     2) データ登録など業務
     3) DBフルバックアップ
      4) トランザクションログのバックアップ(ログ斬り捨て)
     5) DBフルバックアップ
     6) データ登録など業務
      7) トランザクションログのバックアップ(ログ斬り捨て)
      8) データ登録など業務
      9) トランザクションログのバックアップ(ログ斬り捨て)
    10) データ登録など業務
    11) トランザクションログのバックアップ(ログ斬り捨て)
    12) DBフルバックアップ
    13) データ登録など業務
    14) トランザクションログのバックアップ(ログ斬り捨て)
    15) データ登録など業務
    16) トランザクションログのバックアップ(ログ斬り捨て)
    17) データ登録など業務
    18) トランザクションログのバックアップ(ログ斬り捨て)

    このような運用体制だった時、4のログバックアップ時には 3のフルバックアップ以前のトランザクション斬り捨てが実施されます。
    5~14までの間に注目すると、7の時、5でフルバックアップをとっていますので、それ以前のトランザクションログが切り捨て可能となります。
    8の時も最新のフルバックアップが5なので、5以前のログが切り捨て可能であり、 5~8の間に増加したトランザクションログは切り捨てられません。
    何故ならフルバックアップが無いからです。
    14の時はどうかというと 12でフルバックアップがあるので、12以前のログを切り捨て可能となっています。

    なので、手順的には、
    1. まずデータベース全体のフルバックアップを取得する。
    2. トランザクションログの斬り捨てでバックアップを取得する。
    3. 物理ファイルサイズを小さくするためのコマンドを使う。
    になります。

    尾画茶さんは多分 2.3.しか実施されてなく、肝心な 1.が抜けているのだと思われます。
    まずはDBフルバックアップを取得してみてください。



    2009年12月20日 3:48
  • こんにちは、nagino です。

    > DBCC Shrink File (2,truncateonly)
    以下にあるとおり、truncateonly はデータファイルにのみ有効です。
    指定しても意味がありません。

    > 使用可能な空き領域:      240016.22 MB (99%)
    空きが 99% ですので、トランザクションログ自体の切捨ては行われています。
    トランザクションログファイルが、中にはわずかなログと大量の空き領域となっている状態です。
    今回初めてトランザクションログをメンテナンスされたのであれば、おそらくトランザクションログファイルの末尾にログが記録されてしまっていると思われます。
    空き領域がある状態(現在の状態)でダミーの SELECT 文を実行して、トランザクションログのバックアップを取得し、再度 DBCC Shrinkfile を実行してください。(スペースに注意)
    また、その際はターゲットのサイズを指定することをお勧めします。(ぎりぎりまで切り詰めると、再拡張時にパフォーマンスが劣化するため)
    例:DBCC ShrinkFile (2, 1024)



    以下ご参考まで。

    トランザクションログファイルは、全体で一つの大きな輪になっていると考えてください。
    ログを記録している際に、ファイルの終わりまで行くと、先頭に戻って記録を続けます。 (空きが無くなると、ファイルを拡張します。)

    一方で、空き領域の切捨ては、ファイルの末尾からしか行われません。

    そのため、最新のログがファイルの末尾にあると、切捨てが出来ません。
    その場合は、ダミーの SELECT 文で 最新のログをファイルの先頭に記録させ、末尾のログをバックアップすることで、切捨てが出来るようになります。


     
    MCITP(Database Developer/Database Administrator)
    • 回答としてマーク 尾画茶 2009年12月21日 2:06
    2009年12月20日 6:11
  • SHIMSOFTさん、ご回答ありがとうございました。

    フルバックアップは取ってあったのですが、きちんと書いていなくて、すみませんでした。
    ログの切り捨てが、最終地点のフルバックアップの手前までということが、
    わかりやすく説明していただいたので、ログ切り捨てということが、どういうことなのか、理解できました。
    ありがとうございました。
    2009年12月21日 2:01
  • nagino さん、ご回答ありがとうございました。おかげさまで、解決しました!
    トランザクションログがシーケンシャルなものであって、先頭からがいくら空いていても、
    末尾に残っていると、ファイルサイズが小さくならないことがよくわかりました。
    書いていただいたように実施すると、あれだけ大きかったものが、シューッと小さくすぼみました。
    ありがとうございました。
    2009年12月21日 2:06