これは、ほとんどのフォーラムやWeb全体でよくある質問のようです。ここでは、一般的に次のような多くの形式で質問します。
SQL Serverで-
- トランザクションログが非常に大きくなる理由は何ですか?
- ログファイルが非常に大きいのはなぜですか?
- この問題の発生を防ぐ方法は何ですか?
- 根本的な原因を追跡し、トランザクションログファイルを正常なサイズにしたい場合はどうすればよいですか?
これは、ほとんどのフォーラムやWeb全体でよくある質問のようです。ここでは、一般的に次のような多くの形式で質問します。
SQL Serverで-
- トランザクションログが非常に大きくなる理由は何ですか?
- ログファイルが非常に大きいのはなぜですか?
- この問題の発生を防ぐ方法は何ですか?
- 根本的な原因を追跡し、トランザクションログファイルを正常なサイズにしたい場合はどうすればよいですか?
回答:
短い答え:
おそらく、長時間実行されているトランザクションが実行されているか(インデックスのメンテナンス?バッチの大規模な削除または更新?)、または「デフォルト」(デフォルトの意味については以下を参照)リカバリモードでFull
あり、ログバックアップを取得していない(またはそれらを十分に頻繁に服用していない)。
復旧モデルの問題であるSimple
場合、ポイントインタイムリカバリと定期的なログバックアップが不要な場合、簡単な答えは復旧モードに切り替えることです。ただし、多くの人々は、回復モデルを理解せずにその答えを出します。読み続けて、なぜそれが重要なのかを理解してから、あなたが何をするかを決定します。また、ログバックアップの取得を開始し、Full
回復状態を維持することもできます。
他の理由もありますが、これらが最も一般的です。この回答では、最も一般的な2つの理由を詳しく説明し、その理由とその背後にある背景情報を提供するとともに、その他の理由についても説明します。
より長い回答: ログが成長し続ける原因となるシナリオは何ですか?多くの理由がありますが、通常、これらの理由は次の2つのパターンにあります。復旧モデルについての誤解があるか、長時間実行されているトランザクションがあります。詳細をお読みください。
(にいる完全復旧モードと取っていないログのバックアップを -これは、最も一般的な理由である-この問題が発生して、それらの大半があります。)
この回答はSQL Server復旧モデルの詳細な説明ではありませんが、復旧モデルのトピックはこの問題にとって重要です。
Full
、Bulk-Logged
そして Simple
。 今は無視Bulk-Logged
しますが、これはハイブリッドモデルであり、このモデルを使用しているほとんどの人は理由があり、復旧モデルを理解しています。
我々は気に2とその混乱は、この問題を持つ人々の例大半の原因であるSimple
とFull
。
復旧モデルについて説明する前に、一般的な復旧について説明しましょう。このトピックをさらに詳しく知りたい場合は、Paul Randalのブログを読んでください。ただし、この質問については:
クラッシュ/リスタートリカバリ
トランザクションログファイルの目的の1つは、クラッシュ/リスタートリカバリです。クラッシュまたは再起動の前に行われた作業(ロールフォワード/リドゥ)と、クラッシュまたは再起動後に開始されたが終了していない作業(ロールバック/アンドゥ)のロールフォワードおよびロールバック用。トランザクションが開始されたが終了していない(トランザクションがコミットされる前にロールバックまたはクラッシュ/再起動が発生した)ことを確認するのは、トランザクションログの仕事です。そのような状況では、回復中に「ちょっと、これは本当に終わったことはありません。ロールバックしましょう」と言うのはログの仕事です。また、あなたが何かを完了し、クライアントアプリケーションが完了したと言われたことを確認するのはログの仕事です(たとえデータファイルにまだ固まっていないとしても)「ねえ、これは本当に起こった、それを前に進めましょう、アプリケーションがそれがあったと思うようにしましょう」再起動後。今はもっとありますが、それが主な目的です。
タイムリカバリでのポイントは、
トランザクション・ログ・ファイルの他の目的は、私たちに回復する能力を与えることができるようにすることです時点の原因に「おっと」データベース内またはハードウェア障害時のリカバリポイントを保証しますデータベースのデータおよび/またはログファイルが含まれます。このトランザクションログに、回復のために開始および終了したトランザクションの記録が含まれている場合、SQL Serverはこの情報を使用して、問題が発生する前の場所にデータベースを取得します。しかし、それは常に利用可能なオプションではありません。そのためには、適切な復旧モデルでデータベースを使用する必要があり、ログのバックアップを作成する必要があります。
復旧モデルについて:
単純な復旧モデル
したがって、上記の概要では、Simple Recovery
最初にモデルについて説明するのが最も簡単です。このモデルでは、SQL Serverを言っている:「私はあなたがクラッシュし、再起動回復のためのあなたのトランザクション・ログ・ファイルを使用してと元気です...」(あなたは本当にそこに選択肢がない検索します。ACID特性を、それはすぐに意味をなす必要があります。)「...しかし、クラッシュ/リスタートリカバリの目的で不要になったら、ログファイルを再利用してください。」
SQL Serverは、シンプルリカバリでこのリクエストをリッスンし、クラッシュ/リカバリの再開に必要な情報のみを保持します。データがデータファイルに強化されているため(多かれ少なかれ)SQL Serverが回復できることが確認されると、強化されたデータはログに不要になり、切り捨てのマークが付けられます。つまり、再利用されます。
完全復旧モデル
ではFull Recovery
、あなたがいる限り、あなたのログファイルが利用できるか、ログのバックアップによって覆われている、ある特定の時点にあるように、特定の時点に復元することができるようにしたいSQL Serverを語っています。この場合、SQL Serverが単純復旧モデルでログファイルを切り捨てても安全な時点に達すると、それは行われません。代わりに、通常の状況下でログのバックアップをとる(またはログファイルドライブのスペースがなくなる)まで、ログファイルは成長し続け、成長を続けることができます。
ここにはルールと例外があります。長時間実行されるトランザクションについては、以下で詳しく説明します。
ただし、完全復旧モードの注意点は次のとおりです。Full Recovery
モードに切り替えただけで、最初の完全バックアップを実行しない場合、SQL ServerはFull Recovery
モデルへの参加要求を受け入れません。トランザクションログはSimple
、完全復旧モデルに切り替えて最初のを取得するまで、引き続き動作しますFull Backup
。
それで、それが制御されないログの成長の最も一般的な理由ですか?回答:ログのバックアップなしで完全復旧モードになっています。
これは常に人々に起こります。
なぜそれが常に起こるのですか?新しいデータベースはそれぞれ、モデルデータベースを見ることで初期復旧モデル設定を取得するためです。
モデルの初期復旧モデル設定は常にですFull Recovery Model
-誰かがそれを変更するまで、そして変更しない限り。したがって、「デフォルトの復旧モデル」はと言うことができますFull
。多くの人はこれを認識しFull Recovery Model
ていないため、ログバックアップなしでデータベースを実行しているため、トランザクションログファイルは必要以上に大きくなります。これが、組織とそのニーズに合わない場合にデフォルトを変更することが重要である理由です)
また、ログのバックアップを十分に取らないことにより、ここでトラブルに巻き込まれることもあります。
1日にログバックアップをとることは正常に思えるかもしれませんが、リストアに必要なリストアコマンドが少なくなりますが、上記の説明に留意してください。
次の2つの点に留意して、ログのバックアップ頻度を検討する必要があります。
(「私の復旧モデルは問題ありません!ログはまだ増え続けています!)
これは、制御されない、制限されないログの増加の原因にもなります。復旧モデルに関係なく、「しかし、私は単純復旧モデルにいる-なぜ私のログがまだ成長しているのか!」
ここでの理由は簡単です。上記で説明したように、SQLがこのトランザクションログを回復目的で使用している場合、トランザクションの開始までさかのぼる必要があります。
時間がかかるトランザクションや多くの変更を行うトランザクションがある場合、ログは、まだ開いているトランザクションにあるか、そのトランザクションが開始されてから開始された変更のチェックポイントで切り捨てることができません。
これは、1つの削除ステートメントで数百万行を削除する大きな削除は1つのトランザクションであり、その削除がすべて完了するまでログは切り捨てられないことを意味します。ではFull Recovery Model
、この削除がログに記録されるため、大量のログレコードになる可能性があります。メンテナンス時間中にインデックスの最適化が機能するのと同じこと。また、トランザクション管理が不十分であり、開いているトランザクションを監視および終了しないと、ユーザーとログファイルに大きな損害を与える可能性があることも意味します。
ここで自分を救うことができます:
UPDATE TableName Set Col1 = 'New Value'
はトランザクションです。私はBEGIN TRAN
そこに入れませんでしたし、する必要はありません。それはまだ完了したら自動的にコミットする1つのトランザクションです。したがって、多数の行で操作を行う場合は、それらの操作をより管理しやすいチャンクにまとめて、ログに回復する時間を与えることを検討してください。または、それに対処する適切なサイズを検討してください。または、バルクロードウィンドウ中に変化する復旧モデルを調べることもできます。簡単な答え:はい。以下の長い回答。
質問:「ログシッピングを使用しているため、ログバックアップが自動化されています。なぜトランザクションログの増加が見られるのですか?」
答え:読んでください。
ログ配布は、その名のとおりです-DRの目的で、トランザクションログのバックアップを別のサーバーに配布しています。いくつかの初期化がありますが、その後のプロセスは非常に簡単です:
NORECOVERY
またはのいずれかSTANDBY
)リカバリーせずに復元するジョブ。計画どおりに動作しない場合は、監視して警告するジョブもあります。
場合によっては、ログシッピングの復元を1日1回、3日ごと、または1週間に1回だけ行うことができます。それは結構です。ただし、すべてのジョブ(ログバックアップおよびコピージョブを含む)でこの変更を行うと、ログバックアップを取得するためにずっと待機していることになります。つまり、ログバックアップなしで完全復旧モードになっているため、ログが大幅に増加することになります。また、コピーする大きなログファイルも意味する可能性があります。復元ジョブのスケジュールを変更し、ログのバックアップとコピーをより頻繁に行うようにしてください。そうしないと、この回答で説明されている最初の問題が発生します。
これら2つ以外の理由がありますが、これらは最も一般的です。原因に関係なく、この原因不明のログの増加/切り捨ての不足の理由を分析し、それらが何であるかを確認する方法があります。
sys.databases
カタログビューを照会すると、ログファイルが切り捨て/再利用を待機している理由を説明する情報を表示できます。
log_reuse_wait
理由コードのルックアップIDで呼び出される列とlog_reuse_wait_desc
、待機理由の説明がある列があります。参照されている書籍のオンライン記事からは、理由の大部分(表示される可能性が高いものと理由を説明できるものがあります。不足しているものは使用されないか、内部使用されます)斜体:
0 =
何も聞こえない..待つべきではない
1 =チェックポイントチェックポイントの
発生を待機しています。これは起こるはずであり、あなたは大丈夫であるはずです-しかし、後で答えや編集のためにここを探すいくつかのケースがあります。
2 =ログバックアップ
ログバックアップが発生するのを待っています。それらをスケジュールしてすぐに発生するか、ここで説明した最初の問題があり、それを修正する方法を知っている
3 =アクティブなバックアップまたは復元
バックアップまたは復元操作がデータベースで実行されています
4 =アクティブトランザクションログをバックアップする前に
(いずれかの方法で- ROLLBACK
またはCOMMIT
)完了する必要があるアクティブトランザクションがあります。これが、この回答で説明されている2番目の理由です。
5 =データベースミラーリング
高性能ミラーリングの状況でミラーが遅れているか、ある程度の待ち時間がかかっているか、何らかの理由でミラーリングが一時停止している
6 =レプリケーション
これを引き起こすレプリケーションの問題が発生する可能性があります-ログリーダーエージェントが実行されていない、データベースがレプリケーション用にマークされていると判断したなど、さまざまな理由があります。この理由も確認できます。トランザクションがログリーダーによって消費されているように、適切なタイミングを確認しているので、まったく正常です。
7 =データベーススナップショットの作成データベーススナップショットを作成しています。スナップショットの作成中に
適切な瞬間を見ると、これが表示されます。
8 =ログスキャン
私は、これが永久に実行される問題にまだ遭遇していません。十分に長く頻繁に見ると、これが起こるのを見ることができますが、それは私が見た過度のトランザクションログの成長の原因ではないはずです。
9 = AlwaysOn可用性グループのセカンダリレプリカは、このデータベースのトランザクションログレコードを対応するセカンダリデータベースに適用しています。 まだ最も明確な説明について..
最も重く投票された提案を含むStack Overflowの回答には本当に満足していないため、マイクの回答がそうではないということをいくつか述べたいと思います。ここにも私の入力。私もそこにこの答えのコピーを置きました。
ログファイルのサイズを小さくすることは、予期しない成長が発生し、再び発生することが予想されないシナリオのために予約する必要があります。ログファイルが再び同じサイズに拡大する場合、一時的に縮小してもあまり効果はありません。現在、データベースの回復目標に応じて、これらのアクションを実行する必要があります。
何か問題が発生した場合に復元できることを確認せずに、データベースに変更を加えないでください。
(また、ポイントインタイムリカバリとは、完全バックアップまたは差分バックアップ以外に復元できることに関心があることを意味します。)
おそらく、データベースはFULL
回復モードになっています。そうでない場合は、次のことを確認してください。
ALTER DATABASE yourdb SET RECOVERY FULL;
定期的なフルバックアップを行っている場合でも、ログバックアップを実行するまでログファイルは大きくなります。これは、ディスクスペースを無駄に食い止めないための保護のためです。リカバリの目的に応じて、これらのログバックアップを頻繁に実行する必要があります。たとえば、災害発生時に15分以上のデータを失う余裕があるというビジネスルールがある場合、15分ごとにログをバックアップするジョブが必要です。現在の時刻に基づいてタイムスタンプ付きのファイル名を生成するスクリプトを次に示します(ただし、メンテナンスプランなどでこれを行うこともできますが、メンテナンスプランで縮小オプションを選択しないでください。ひどいです)。
DECLARE @path NVARCHAR(255) = N'\\backup_share\log\yourdb_'
+ CONVERT(CHAR(8), GETDATE(), 112) + '_'
+ REPLACE(CONVERT(CHAR(8), GETDATE(), 108),':','')
+ '.trn';
BACKUP LOG foo TO DISK = @path WITH INIT, COMPRESSION;
\\backup_share\
異なる基になるストレージデバイスを表す別のマシン上にある必要があることに注意してください。これらを同じマシン(または同じ基盤ディスクを使用する別のマシン、または同じ物理ホスト上にある別のVM)にバックアップしても、マシンが破裂した場合はデータベースが失われるため、実際には役立ちません。およびそのバックアップ。ネットワークインフラストラクチャによっては、ローカルでバックアップしてから、舞台裏で別の場所に転送する方が合理的かもしれません。どちらの場合でも、できるだけ早くプライマリデータベースマシンからそれらを取得する必要があります。
さて、定期的なログバックアップを実行したら、ログファイルを現在よりも適切なものに縮小するのが合理的です。これは、ログファイルが1 MBになるまで繰り返し実行することを意味するものではありません。SHRINKFILE
ログを頻繁にバックアップする場合でも、発生する可能性のある同時トランザクションの合計に対応する必要があります。ログファイルの自動拡張イベントは、SQL Serverが(インスタントファイルの初期化が有効になっている場合のデータファイルとは異なり)ファイルをゼロにする必要があるため、コストが高くなります。このgrow-shrink-grow-shrinkルーチンをできる限り少なくしたいので、ユーザーに支払いをさせたくはありません。
縮小が可能になる前に、ログを2回バックアップする必要がある場合があることに注意してください(Robertに感謝)。
そのため、ログファイルの実用的なサイズを考え出す必要があります。システムの詳細を知らない限り、これが何であるかを伝えることはできませんが、ログファイルを頻繁に圧縮し、再び成長している場合、良い透かしはおそらく最大のものよりも10-50%高いです。これが200 MBになり、その後の自動拡張イベントを50 MBにしたい場合、この方法でログファイルのサイズを調整できます。
USE [master];
GO
ALTER DATABASE Test1
MODIFY FILE
(NAME = yourdb_log, SIZE = 200MB, FILEGROWTH = 50MB);
GO
ログファイルが現在200 MBを超える場合は、最初にこれを実行する必要がある場合があることに注意してください。
USE yourdb;
GO
DBCC SHRINKFILE(yourdb_log, 200);
GO
これがテストデータベースであり、ポイントインタイムリカバリを気にしない場合は、データベースがSIMPLE
リカバリモードであることを確認する必要があります。
ALTER DATABASE yourdb SET RECOVERY SIMPLE;
データベースをSIMPLE
回復モードにすると、すべてのトランザクションの記録を保持するために成長するのではなく、SQL Serverがログファイルの一部を再使用する(本質的に非アクティブなトランザクションを段階的に削除する)ようになりFULL
ます(回復はログをバックアップするまで行う)。CHECKPOINT
イベントはログを制御するのに役立ち、CHECKPOINT
sの間に多くのt-logアクティビティを生成しない限り、ログを大きくする必要がないようにします。
次に、このログの増加は、通常の日常的な使用によるものではなく、異常なイベント(たとえば、毎年の春の大掃除または最大のインデックスの再構築)によるものであることを絶対に確認する必要があります。ログファイルをとてつもなく小さいサイズに縮小し、SQL Serverが通常のアクティビティに対応するために再び大きくする必要がある場合、何を得ることができましたか?一時的に解放したディスク領域を使用できましたか?すぐに修正する必要がある場合は、次を実行できます。
USE yourdb;
GO
CHECKPOINT;
GO
CHECKPOINT; -- run twice to ensure file wrap-around
GO
-- 200 MB
DBCC SHRINKFILE(yourdb_log, 200);
GO
それ以外の場合は、適切なサイズと成長率を設定します。ポイントインタイムリカバリの例のように、同じコードとロジックを使用して、適切なファイルサイズを決定し、適切な自動拡張パラメーターを設定できます。
TRUNCATE_ONLY
オプションでログをバックアップしてから、を押しますSHRINKFILE
。たとえば、このTRUNCATE_ONLY
オプションは廃止されており、現在のバージョンのSQL Serverでは使用できなくなりました。次に、FULL
復旧モデルを使用している場合、これによりログチェーンが破壊され、新しい完全バックアップが必要になります。
データベースをデタッチし、ログファイルを削除して、再アタッチします。これがどれほど危険かは強調できません。データベースがバックアップされない、疑わしいと思われる、バックアップがある場合はバックアップに戻さなければならないなど。
「データベースの縮小」オプションを使用します。DBCC SHRINKDATABASE
また、特にログの問題を解決する必要がある場合は、同じことを行うための保守計画オプションは悪い考えです。DBCC SHRINKFILE
またはを使用して、調整するファイルをターゲットにし、個別に調整しますALTER DATABASE ... MODIFY FILE
(上記の例を参照)。
ログファイルを1 MBに縮小します。これは、SQL Serverが特定のシナリオでそれを実行させ、それが解放するすべてのスペースを調べるためです。データベースが読み取り専用でない限り(そして、を使用してデータベースをそのようにマークする必要がありますALTER DATABASE
)、ログは復旧モデルに関係なく現在のトランザクションに対応する必要があるため、これは絶対に多くの不必要な成長イベントにつながります。SQL Serverがゆっくりと苦痛を取り戻すために、その領域を一時的に解放することのポイントは何ですか?
2番目のログファイルを作成します。これにより、ディスクがいっぱいになったドライブが一時的に軽減されますが、これはパンクした肺をバンドエイドで修復しようとするようなものです。別の潜在的な問題を追加するだけでなく、問題のあるログファイルを直接処理する必要があります。トランザクションログアクティビティの一部を別のドライブにリダイレクトする以外、2つ目のログファイルは実際には何もしません(2つ目のデータファイルとは異なります)。一度に使用できるファイルは1つだけです。Paul Randalはまた、複数のログファイルが後であなたに噛み付く理由を説明します。
ログファイルを少しだけ縮小し、それ自体を常に小さな速度で自動成長させる代わりに、ある程度大きなサイズ(同時トランザクションの最大セットの合計に対応するサイズ)に設定し、適切な自動成長を設定します。フォールバックとして設定します。これにより、単一のトランザクションを満たすために複数回成長する必要がなくなり、通常のビジネスオペレーション中に成長することが比較的まれになります。
ここで考えられる最悪の設定は、1 MBの成長または10%の成長です。おもしろいことに、これらはSQL Serverのデフォルトです(私は文句を言い、変更を要求していません)-データファイル用に1 MB、ログファイル用に10%。前者はこの日と年齢では非常に小さく、後者は毎回より長いイベントにつながります(たとえば、ログファイルは500 MB、最初の成長は50 MB、次の成長は55 MB、次の成長は60.5 MBです)などなど-そして、遅いI / Oでは、信じてください、あなたは本当にこの曲線に気付くでしょう)。
ここでやめないでください。ログファイルの縮小に関して見られるアドバイスの多くは本質的に悪いものであり、破滅的なものになる可能性もありますが、ディスク領域を解放するよりもデータの整合性を重視する人もいます。
ログファイルの内容も確認できます。それを行うには、文書化されていないfn_dblog
、またはApexSQL Logなどのトランザクションログリーダー。
これは、索引の再編成を示していないが、それはすべてのDMLおよびDDL様々なイベントを示していますALTER
、CREATE
、DROP
、助成金/権限、オブジェクト名の変更を取り消す、トリガが有効/無効。
免責事項:ApexSQLでサポートエンジニアとして働いています
これは、ログが増大してディスクがいっぱいになるほとんどすべてのDBAにとって最も頻繁に直面する問題です。
トランザクションログが非常に大きくなる理由は何ですか?
•ログファイルが非常に大きいのはなぜですか。
表のlog_reuse_wait_des
c列をチェックしてsys.databases
、ログの切り捨てを保持しているものを確認します。
select name, log_reuse_wait_desc
from sys.databases
•この問題の発生を防ぐ方法は何ですか?
ログのバックアップは、ログの再利用を妨げているものがない限り、ログの増加を制御するのに役立ちます。
•根本的な原因を追跡し、トランザクションログファイルを正常なサイズにしたい場合はどうすればよいですか?
実際に何が原因であるかを特定したら、以下のページで説明するように、それに応じて修正してみてください。
https://www.brentozar.com/archive/2016/03/my-favorite-system-column-log_reuse_wait_desc/
適切なログバックアップをスケジュールすることは、異常な状況を除き、ログの増加に対処する最良の方法です。