web-dev-qa-db-ja.com

トランザクションログは非常に急速に成長しています

SQL Server 2014データベーストランザクションログの1つが非常に急速に成長しており、その根本的な原因を見つけることができません。

シンプルリカバリモードのデータベース。完全バックアップ中に、ログファイルはその制限(800GB)に増加し、バックアップは失敗します。

バックアップ中にトランザクションを確認したところ、何も問題はありませんでした。

すべてのトランザクションは通常の読み込みであり、メンテナンスジョブはありません(インデックスの再構築など)。

バックアップによってログが再利用されないことは承知していますが、これはバックアップ期間中に800GBの変更を意味するため、意味がありません。

このDBを、同様のDBサイズ、ロード、およびバックアップ期間と比較しました。 2番目のDBログは400GBを超えて成長していません。

DBサイズは7TBです。バックアップ時間は約20時間です。ログが増加している唯一の時間は、バックアップ中です。 Log_reuseは正しいBackup_Restoreを示します。長時間実行されるトランザクションはありません。

問題は、ログの増加の「速度」です。同じ負荷および同じバックアップ期間を持つ同様のサイトと比較すると、ログは4分の1になります。

6
Yorik

データベースの完全バックアップを実行している間、SQL Serverはバックアップの間トランザクションログを再利用できませんデータベースがSIMPLE recoveryであっても。データベースが非常にビジーな場合、またはバックアップに長い時間がかかる場合は、大きなトランザクションログが必要になる可能性がありますデータベースがSIMPLE recoveryであっても。

SQL Serverがこれを行う必要があるのはなぜですか?

データベースを一連の百科事典を含む本棚と考えてください。各テーブルはそのセット内の本です。 SQL Serverはバイブラリアンです。司書は、セットのスナップショットを取得するために、セット内のすべての本のコピーを作成する必要があります。

司書(SQL Server)は、棚(データベース)の一端から本(テーブル)のコピーを開始し、それを遠端に移動します。 これには時間がかかります。ブック内のデータが変更されている場合(データベーストランザクションなど)、整合性が取れています(Aの「C」です[〜#〜 ] c [〜#〜]ID)スナップショットが課題になります。

このタイムラインを考えてみましょう:

  • 司書は本Aをコピーします。
  • 司書は本Bをコピーします。
  • 書籍AとZが更新されました。
  • 司書は本Cをコピーします。
  • 司書は本Dをコピーします。
  • 書籍C、X、Y、Zが更新されました。
  • 司書は本のE-Zをコピーします。バックアップが完了しました。

司書のバックアップは一貫していません。古いデータの一部(Books AとC、および更新されたデータの一部(Books X、Y、Z)があります。データをconsistentにするために、司書は追跡できます。書籍AとCで変更されたものロールフォワード彼女のバックアップコピーの変更。

ライブラリアンが一貫性のないバックアップを持つことは問題ないかもしれませんが、SQL Serverが一貫性のないバックアップを持つことは問題です。 SQL Serverのバックアップは、単一の時点に一貫している必要があります

SQL Serverはこれをどのように行うのですか?

SQL Serverがデータページのバックアップを開始すると、トランザクションログを介してトランザクションの追跡も開始します。最後のデータページをバックアップした後、データバックアップ中に発生したすべてのトランザクションもバックアップします。復元時に、必要に応じてこれらのトランザクションをロールバックまたはフォワードし、一貫性のあるイメージが復元されるようにします。

Simple Recoveryでの使用中のデータベースのバックアップ

OPのコメントによると、問題のデータベースは7TBであり、バックアップには20時間かかります。つまり、このデータベースのトランザクションログは、20時間分のトランザクションに対応できる十分な大きさでなければなりません。アクティビティの量と種類によっては、必要なトランザクションログの量が非常に多くなる可能性があります。

必要なトランザクションログの量を減らすには、 バックアップを高速化 するか、書き込みアクティビティが少ない時間にバックアップを取るか、またはその両方を行います。

3
AMtwo

あなたが言うことに基づいて、おそらくデータベースで長時間実行されているトランザクションがあり、トランザクションが完了するまでログファイルは切り捨てられません

sys.databases何が起こっているのかを調べます。

SELECT name,
       log_reuse_wait,
       log_reuse_wait_desc
FROM sys.databases;

log_reuse_waitおよびlog_reuse_wait_descは、あなたが知る必要があるすべてを教えてくれます。ここに表示される内容の説明は次のとおりです。

  • 0何もない
  • 1チェックポイントチェックポイントの発生を待機しています。これはOKです
  • 2ログのバックアップログのバックアップが実行されるのを待っています。

  • 3アクティブなバックアップまたは復元。バックアップまたは復元操作が実行されています

  • 4アクティブなトランザクションデータベースにアクティブなトランザクションがあります
  • 5データベースミラーリングミラーにキューがあり、プライマリサーバーの背後にあるか、何らかの理由でミラーリングが一時停止しています
  • 6レプリケーションレプリケーションが実行されているか、データベースがレプリケーションとマークされているか、またはレプリケーションが構成されている場合はすべて正常である
  • 7データベーススナップショットの作成
  • 8ログスキャン
  • 9 AlwaysOnの可用性

問題が長時間実行されているトランザクションである場合、オプションはそれを見つけて、たとえば Adam MachanicのWhoIsActive ストアドプロシージャを使用して、それが何のためにあるかを見つけることです。

データベースの「考える」レプリケーションが行われている場合は、おそらくログファイルを再構築する必要があります。

詳細と考えられる解決策については、下記のリソースを参照してください。

リンク:

1
George K