SQLデータベースに関する知識を集めようとしていますが、トランザクションログファイル(LDF)について質問があります。
まず、データベースを作成するときに、データベースとログファイルの両方の初期ファイルサイズを定義する必要があります。私が見ることができることから、ディスク上にファイルが作成されると、データベースに実際のデータがあるかどうか、またはトランザクション(ログ)があるかどうかに関係なく、指定されたサイズになります。
私の理解は、データベースをバックアップすることでした:
内部のログを「空にする」ことによる、ディスク上のLDFファイルの削除。
ログファイルのサイズが固定されているように見えるため、これを正しく理解していないようです。私の実際の質問は次のようになります:
ログの切り捨ては実際にログファイル(LDF)に対して何をしますか?このプロセスは、ディスクがいっぱいになるのを防ぐためのものです。
一部の概念を正しく理解していない場合は、修正してください。
ありがとうございました!
トランザクションログファイル(LDF)は、内部の多数の仮想ログファイル(VLF)で構成されています。引き出し式の引き出しがいくつかあるキャビネットのようなものだと考えてください。大きなキャビネットを選択することも、小さなキャビネットを選択することもできますが、それでも、引き出しの数が異なるだけの固定サイズになります。
SQL Serverが動作すると、トランザクションが引き出し(VLF)に入れられます。キャビネットの一端から始まり、最初の引き出しがいっぱいになり、その引き出しにスペースがなくなると、次の引き出しに移動します。
トランザクションログをバックアップするとき、実際に行っていることは次のとおりです。
バックアップによってキャビネット(ログファイル)のサイズが変更されることはありません。
トランザクションログのバックアップは、トランザクションログファイルの切り捨てとは異なり、トランザクションログファイルの切り捨ては、トランザクションログファイルの圧縮とは異なります。ああ、そうです。トランザクションログファイルをバックアップしても、切り捨ては発生しません。現在の負荷に応じて、データベースエンジンはチェックポイントを設定することを決定する場合がありますが、切り捨てを少し待機します。
トランザクションログファイルは、データベースがSIMPLE復旧モデルであるかFULL復旧モデルであるかに関係なく、データベースエンジンがデータに加えられた変更をデータベースに格納する場所です。 (重要)
これで、データベースのトランザクションログファイルは、1つの連続したストレージコンテナーではなく、トランザクションログ(TLog)ファイル内に順次に作成される仮想ログファイル(VLF)のコレクションになります。 VLFのサイズは、現在使用しているSQL Serverのバージョン、およびTLogファイルの作成中に選択した初期サイズ、および(存在する場合)の自動拡張設定で選択したサイズによって異なります。 TLogファイル。
参照:
- VLF SQL Server 2014での作成アルゴリズム)への重要な変更 (SQLSkills.com)
- 初期VLFシーケンス番号とデフォルトのログファイルサイズ (SQLSkills.com)
- ストレージエンジン内:ログの循環性の詳細 (SQLSkills.com)
...そしておそらく逆の順序で
データベースでデータが変更されると、データベースエンジンはこれらの変更を対応するデータベースのTLogに書き込み、トランザクションの一貫性を維持します。これは ACID-原子性、一貫性、分離性、耐久性 とも呼ばれます。これらの変更の実際のトランザクションは、TLog(ファイル)のVLFに格納されます。 VLF=がいっぱいの場合、最新のトランザクションは、次に利用可能なVLFに順番に格納されます。
ただし、TLogファイルの最後に到達した場合、変更はTLogファイルの最初の最初のVLF=に保存されます。 ストレージエンジン内で説明:ログの循環性について )
新しいトランザクションを自由に保存できる利用可能なVLFがなく、自動拡張設定が構成されている場合、データベースエンジンは、定義された量だけTLogファイルを拡張し、自動拡張設定と式で定義されたサイズに応じて追加のVLFを作成します VLF SQL Server 2014の作成アルゴリズム)への重要な変更 で説明されています。その後、次のVLF TLogファイル。
TLogファイルのバックアップをトリガーすると、データベースエンジンに
これまでのところ、TLogファイル内でデータベースエンジンが再利用できるスペースは解放されていません...
...しかし、データベースエンジンに余裕のあるサイクルがあり、非常に大きなプレッシャーがかかっていない場合は、TLogファイルを確認することがあります。チェックポイントに注意し、VLFを解放して再利用します。 TLogファイル内のスペースはVLF(同じサイズ、同じ場所)によって引き続き使用されますが、再利用は自由です。
これは Transaction Log Truncation に文書化されています:
何らかの理由で遅延した場合を除いて、ログの切り捨ては次のように自動的に行われます。-単純復旧モデルでは、チェックポイントの後。
- 完全復旧モデルまたは一括ログ復旧モデルでは、ログバックアップ後、前回のバックアップ以降にチェックポイントが発生した場合。詳細については、このトピックで後述する「完全および一括ログ復旧モデルでのログの切り捨て」を参照してください。
これが発生しない場合があります。
自動ですが、ログの切り捨てはさまざまな要因によって遅延する可能性があります。ログの切り捨てを遅らせることができるものについては、「 ログの切り捨てを遅らせる要因 」を参照してください。
ログの切り捨ては、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ファイルの拡大を防ぐという利点があります[〜#〜] [〜#〜]自動拡大設定が設定されている場合。
自動拡張設定が設定されていない場合、TLogファイルが固定サイズであると要件エンジニアリングプロセスが判断したため、ここでの最悪のケースはTLogバックアップが発生せず、解放されているVLFがないため、TLogがいっぱいになる。 TLogは拡張できず、VLFは解放されないため、さらにトランザクションをTLogファイル(または内部でVLF)に書き込むことができます。
Brent Ozarがすでにトランザクションログファイルがどのように見えるかについて説明しましたが、私はあなたの特定の質問に焦点を当てます
私の理解は、データベースをバックアップすることでした:
- トランザクションログを切り捨てます。
- サイズを縮小します
完全バックアップは、どの復旧モデルのトランザクションログにも影響を与えません。完全復旧モデルでは、トランザクションログのバックアップを取ると、ログが切り捨てられます。 VLFを保持している長期実行トランザクションがまだ存在する場合、またはブレントの説明に従って引き出しを引き続き必要とする場合、他のトランザクションは引き出しを再利用できないか、技術的には再利用できるように切り捨てられないことに注意してください。
また、トランザクションログは圧縮されません。ログを圧縮するには、dbcc shrinkfile
コマンドを使用する必要があります
ログの切り捨ては実際にログファイル(LDF)に対して何をしますか?このプロセスは、ディスクがいっぱいになるのを防ぐためのものです。
それはログファイルを再利用可能にするので、他のトランザクションがそれを使用したり、ブレントの類推に従って他の誰かがドロワーを使用してデータを保持したりできます。
答えを読んだ後、トランザクションログについて読むことを強くお勧めします SQLSKILLS.com