データベースをバックアップすると、トランザクションログのサイズが小さくなりますか?


8

SQLデータベースに関する知識を集めようとしていますが、トランザクションログファイル(LDF)について質問があります。

まず、データベースを作成するときに、データベースとログファイルの両方の初期ファイルサイズを定義する必要があります。私が見ることができることから、ディスク上にファイルが作成されると、データベースに実際のデータがあるかどうか、またはトランザクション(ログ)があるかどうかに関係なく、指定されたサイズになります。

私の理解は、データベースをバックアップすることでした:

  1. トランザクションログを切り捨てます。
  2. サイズを縮小します

内部のログを「空にする」ことによる、ディスク上のLDFファイルの削除。

ログファイルのサイズが固定されているように見えるため、これを正しく理解していないようです。私の実際の質問は次のようになります:

ログの切り捨ては実際にログファイル(LDF)に対して何をしますか?このプロセスは、ディスクがいっぱいになるのを防ぐためのものです。

一部の概念を正しく理解していない場合は、修正してください。

ありがとうございました!

回答:


20

トランザクションログファイル(LDF)は、内部の多数の仮想ログファイル(VLF)で構成されています。引き出し式の引き出しがいくつかあるキャビネットのようなものだと考えてください。大きなキャビネットを選択することも、小さなキャビネットを選択することもできますが、それでも、引き出しの数が異なるだけの固定サイズになります。

SQL Serverが動作すると、トランザクションが引き出し(VLF)に入れられます。キャビネットの一端から始まり、最初の引き出しがいっぱいになり、その引き出しにスペースがなくなると、次の引き出しに移動します。

トランザクションログをバックアップするとき、実際に行っていることは次のとおりです。

  • まだバックアップされていないトランザクションが含まれている最初の引き出しを見つける
  • それらのトランザクションを別の場所にコピーする
  • SQL Serverが次の引き出しに移動したために、その引き出しがもはやアクティブに使用されていない場合は、その引き出しを再利用可能としてマークしています(すべてのコンテンツを捨てていると考えてください)。

バックアップによってキャビネット(ログファイル)のサイズが変更されることはありません。


こんにちはブレント、私のためにそれを片付けてくれてありがとう、感謝します!したがって、基本的に、「キャビネット」のサイズを縮小することはできません。引き出しは空にすることしかできません。今、私はログサイズのゆがみについて話している人々の多くの投稿を読みました。これは、VLF(ドロワーのコンテンツ)のサイズを縮小し、実際にディスク上のLDFファイルのサイズをゆがめることを指しますか?私が今理解できることから、「キャビネット」を沈めることはできません。ありがとう!
アンソニー

うん@Anthony、ログ・ファイルのサイズを縮小することにより、キャビネットのサイズを小さくすることができますが、一般的に、それは(あなたが約読んだ理由のため。)非常に悪い考えです
ブレントOzar

TLogを縮小することは悪いことだと私は拒否します。Tlogアクセスはかなりシーケンスです。本来は。ログを圧縮するときにデータを再編成する必要はありません(データファイルの場合と同様です。解放できるのは、最後のアクティブポインタを超えたときのみです)。そのため、これはまったく断片化を引き起こしません。
Heiko

1
@HeikoHatzfeldの拡張はブロッキング操作であり、インスタントファイル初期化を利用しないため、非常に遅くなります。拒否されたオーバーライド。;-)
ブレントオザー

定期的に行うことは何もありませんが、正しいバックアップ計画を設定していないことに気付いた後に一度だけ...そして、成長率は一定で妥当なサイズでなければなりません。それらの条件の下でその耐えられる。
Heiko

6

マッチングとミキシング

トランザクションログのバックアップは、トランザクションログファイルの切り捨てとは異なり、トランザクションログファイルの切り捨ては、トランザクションログファイルの圧縮とは異なります。ああ、そうです。トランザクションログファイルをバックアップしても、切り捨ては発生しません。現在の負荷に応じて、データベースエンジンはチェックポイントを設定することを決定する場合がありますが、切り捨てを少し待機します。

説明する

トランザクションログファイルは、データベースがSIMPLE復旧モデルであるかFULL復旧モデルであるかに関係なく、データベースエンジンがデータに加えられた変更をデータベースに格納する場所です。(重要)

これで、データベースのトランザクションログファイルは、1つの連続したストレージコンテナーではなく、トランザクションログ(TLog)ファイル内に順番に作成される仮想ログファイル(VLF)のコレクションになります。VLFのサイズは、現在使用しているSQL Serverのバージョン、およびTLogファイルの作成中に選択した初期サイズ、および(存在する場合)の自動拡張設定で選択したサイズによって異なります。 TLogファイル。

参考文献:
- SQL Serverの2014年にVLF作成アルゴリズムへの重要な変更(SQLSkills.com)
- 初期VLFのシーケンス番号と、デフォルトのログ・ファイル・サイズ(SQLSkills.com)
- 内部ストレージエンジン:ログの円形性質に関する詳細 (SQLSkills。 com)
...そしておそらく逆の順序で

データベースでデータが変更されると、データベースエンジンはこれらの変更を対応するデータベースのTLogに書き込み、トランザクションの一貫性を維持します。これはACIDとしても知られています-原子性、一貫性、分離、耐久性。これらの変更の実際のトランザクションは、TLog(ファイル)のVLFに格納されます。VLFがいっぱいになると、最新のトランザクションが次に使用可能なVLFに順番に格納されます。

例外

ただし、TLogファイルの最後に到達した場合、変更はTLogファイルの最初の最初のVLFに保存されます。(ストレージエンジンの内部で説明:ログの循環性の詳細

新しいトランザクションを自由に保存できる利用可能なVLFがなく、自動拡張設定が構成されている場合、データベースエンジンは、定義された量だけTLogファイルを拡張し、自動拡張設定と式で定義されたサイズに応じて追加のVLFを作成しますSQL Server 2014のVLF作成アルゴリズムの重要な変更で説明されています。その後のトランザクションは、TLogファイル内の次のVLFに格納できます。

TLogファイルのバックアップ

TLogファイルのバックアップをトリガーすると、データベースエンジンに

  • TLogファイルを見てください。
  • 最後のトランザクションログバックアップがいつ発生したかを判別します(LSN:ログシーケンス番号、詳細な調査用)
  • TLogファイルにチェックポイントを設定する(データベースチェックポイント(SQL Server)
  • バックアップが完了する直前に以前のLSNと最後にコミットされたLSNを追跡しながら、TLogファイルのバックアップコピーをディスク/テープに保存します
  • すべての変更を「データベース」に転送します
  • VLFを再利用可能としてマークする

これまでのところ、TLogファイル内でデータベースエンジンが再利用できるスペースは解放されていません...

TLogファイルの自動切り捨て

...しかし、データベースエンジンに余裕のあるサイクルがあり、非常に大きなプレッシャーがかかっていない場合は、TLogファイルが確認されることがあります。チェックポイントに注意して、VLFを解放して再利用します。TLogファイル内のスペースはVLF(同じサイズ、同じ場所)によって引き続き使用されますが、再利用は自由です。

これは、トランザクションログの切り捨てで文書化されています。

何らかの理由で遅延した場合を除き、ログの切り捨ては次のように自動的に行われます。-単純復旧モデルでは、チェックポイントの後。

  • 完全復旧モデルまたは一括ログ復旧モデルでは、ログバックアップの後、前回のバックアップ以降にチェックポイントが発生した場合。詳細については、このトピックで後述する「完全および一括ログ復旧モデルでのログの切り捨て」を参照してください。

これが発生しない場合があります。

自動ですが、ログの切り捨てはさまざまな要因によって遅延する可能性があります。ログの切り捨てが遅れる原因については、「ログの切り捨てを遅らせる要因」を参照してください。

ログの切り捨ての視覚化

ログの切り捨ては、SQLステートメントまたはSSMS UIのデータベーススペースレポートを使用してTLogサイズをクエリするときに確認できます。TLogファイル内の使用済みスペースは、使用可能なTLogファイルサイズの1%にすぎない場合があります。

収縮するかしないか

一般的な推奨事項は、TLogファイルを縮小しないことです。これは、TLogファイルが特定の理由で大きくなり、元のサイズに再び大きくなる可能性があるためです。しかし、それは別の投稿の話です。TLogファイル内のVLFのサイズを再作成するときなど、いくつかの理由があります。

あなたの質問に答える

あなたの仮定と質問のすぐ下にインライン

私の理解は、データベースをバックアップすることでした:

  • トランザクションログを切り捨てます。

これは間違った仮定です。データベースのバックアップ(FULL、DIFFERENTIAL)は、TLogファイルに対しては何もしません。完全バックアップでは、TLogファイルからコミットされたトランザクションとともにデータベースの一貫した状態が作成されます。DIFFバックアップは、データベースの最後のフルバックアップ以降の過去のすべてのTLogバックアップの一貫した状態を作成します。

ただし、TLOGバックアップは、TLogファイルからコミットされたトランザクションのバックアップを作成し、チェックポイントを設定し、再利用のためにVLFを解放します(高負荷でない場合)。

  • サイズを縮小します

いいえ、FULLおよびDIFFバックアップを検討する場合。いいえ、TLOGバックアップを検討する場合、データベースエンジンに余裕がある場合は、TLogファイル内のVLFを解放します。

ログの切り捨ては実際にログファイル(LDF)に対して何をしますか?このプロセスは、ディスクがいっぱいになるのを防ぐためのものです。

ログを切り捨てることにより、VLFを再利用できます。それで全部です。

このプロセスには、TLogファイルのIFの増大を防ぐという利点があります。自動成長の設定が設定されているが。

自動拡張設定が設定されていない場合、要件エンジニアリングプロセスでTLogファイルが固定サイズであると判断されたため、ここでの最悪のケースは、TLogバックアップが発生せず、VLFが解放されないため、TLogがいっぱいになることです。TLogは拡張できず、VLFは解放されず、TLogファイル(または内部でVLF)にさらにトランザクションを書き込むことができます。


4

Brent Ozarがすでにトランザクションログファイルがどのように見えるかについて説明しましたが、私はあなたの特定の質問に焦点を当てます

私の理解は、データベースをバックアップすることでした:

  • トランザクションログを切り捨てます。
  • サイズを縮小します

完全バックアップは、どの復旧モデルのトランザクションログにも影響を与えません。完全復旧モデルでは、トランザクションログのバックアップを取ると、ログが切り捨てられます。VLFを保持している長期実行トランザクションがまだ存在する場合、またはブレントの説明に従って引き出しを引き続き必要とする場合、他のトランザクションは引き出しを再利用できないか、技術的には再利用できるように切り捨てられないことに注意してください。

また、トランザクションログは圧縮されません。ログを圧縮するには、dbcc shrinkfileコマンドを使用する必要があります

ログの切り捨ては実際にログファイル(LDF)に対して何をしますか?このプロセスは、ディスクがいっぱいになるのを防ぐためのものです。

ログファイルを再利用できるようにすることで、他のトランザクションがログファイルを使用したり、ブレントのアナロジーに従って他の誰かがドロワーを使用してデータを保持したりできるようにします。

回答を読んだ後、SQLSKILLS.comのトランザクションログについて読むことを強くお勧めします


Shankyに感謝します。説明をありがとうございます。そのため、バックアップがログを切り捨てる場合、実際にはLDFファイルのサイズは削減されず、他のトランザクションがそのログファイル内で処理されるための「スペースを空ける」だけです。これを想定して正しいですか?ありがとう!
アンソニー

あなたは絶対的に正しいです。
シャンキー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.