次の方法で共有


MSSQLSERVER_9017

適用対象: SQL サーバー

詳細

属性 Value
製品名 SQL Server
イベント ID 9017
イベント ソース MSSQLSERVER
コンポーネント SQLEngine
シンボル名 LOG_MANY_VLFS
メッセージ テキスト データベース %ls には、過剰な %d を超える仮想ログ ファイルがあります。 仮想ログ ファイルが多すぎると、起動とバックアップの時間が長くなることがあります。 仮想ログ ファイルの数を減らすには、ログを縮小し、別の増加増分を使用することを検討してください。

説明

データベースの起動時に、SQL Server はデータベースに多数の 仮想ログ ファイル (VTF) があることを検出し、このエラー メッセージをログに記録します。 エラーが発生する可能性がある状況は次のとおりです。

  • SQL Server のインスタンスを起動する場合
  • データベースを復元する
  • データベースのアタッチ

この例に似た 9017 情報メッセージは、SQL Server エラー ログに記録されます。

Database dbName has more than n virtual log files which is excessive. Too many virtual log files can cause long startup and backup times. Consider shrinking the log and using a different growth increment to reduce the number of virtual log files. Too many virtual log files can adversely affect the recovery time of the database.

さらに、環境内でレプリケーション、データベース ミラーリング、または AlwaysOn テクノロジを使用すると、これらのテクノロジのパフォーマンスの問題が発生する可能性があります。

レプリケーションに対する多くの VTF の影響

ログ リーダー プロセスでは、レプリケーションのマークが付けられたトランザクションについてすべての仮想ログ ファイルをスキャンする必要があるため、ログ ファイルが多すぎるとレプリケーションに影響する可能性があります。 この動作は、sp_replcmds ストアド プロシージャのパフォーマンスをトレースすることで確認できます。 ログ リーダー プロセスでは、sp_replcmds ストアド プロシージャを使用して仮想ログ ファイルをスキャンし、レプリケーション用にマークされたトランザクションを読み取ります。

原因

この問題は、トランザクション ログ ファイルの FILEGROWTH パラメーターに小さい値を指定した場合に発生します。

SQL Server データベース エンジンは、各物理ログ ファイルを複数の仮想ログ ファイル (VLF) に内部的に分割します。 SQL Server 2008 R2 Service Pack 2 では、データベースの起動時にログに記録される新しいメッセージ (9017) が導入されました (SQL Server のインスタンスの開始またはデータベースのアタッチまたは復元のため)。 SQL Server 2008 R2 で 1,000 を超える VLFS を持っているか、SQL Server 2012 以降のバージョンで 10,000 を超える VLFS が含まれています。

Note

SQL Server 2012 では、このメッセージはデータベースに 10,000 個の VLF がある場合にログに記録されますが、エラー ログで報告される実際のメッセージには"1000 VLF" と誤って表示されます。この警告は、10,000 個の VLF の後に発生します。 ただし、メッセージは 1,000 個の VLF を報告します。 この問題は、後のリリースで修正されます。

ユーザー アクション

この問題を解決するには、次の手順に従ってください。

  1. このクエリを使用して、SQL Server の VLF 数と平均サイズを表示できます。 結果は、次に重点を置くデータベースを特定するのに役立ちます。

    SELECT db.name, count(dbl.database_id) as Total_VLF_count, convert(decimal (10,2), avg(dbl.vlf_size_mb)) as Avg_VLF_Size_MB
    FROM sys.databases db
     CROSS APPLY sys.dm_db_log_info(db.database_id) dbl
    GROUP BY db.name
    ORDER BY Total_VLF_count DESC
    

    詳細については、 sys.dm_db_log_infoを参照してください。

  2. DBCC SHRINKDB/DBCC SHRINKFILE を使用するか、SQL Server Management Studio を使用して、トランザクション ログを減らします。

  3. トランザクション ログ ファイルのサイズを 1 回限り大きな値に増やします。 この 1 回限りの増加は、頻繁な自動拡張を回避するために行われます。 詳細については、「 トランザクション ログ ファイルのサイズを管理するを参照してください。

  4. FILEGROWTH パラメーターを、現在構成されている値よりも大きい値に増やします。 これは、データベースのアクティビティとログ ファイルの増加頻度に基づく必要があります。

  5. さらに、現在実行している SQL Server のバージョンに応じて、次の修正記事を確認できます。

    修正: SQL Server 2008 R2、SQL Server 2008、または SQL Server 2012 でデータベースを復元するには時間がかかります

    修正: SQL Server 2005、SQL Server 2008、または SQL Server 2008 R2 のトランザクション ログ内に多数の VTF がある場合にデータベースを回復するとパフォーマンスが低下する

    修正: SQL Server 2008 または SQL Server 2008 R2 環境のデータベースの復旧に予想以上の時間がかかる

ヒント

指定されたインスタンスにおいて、すべてのデータベースの現在のトランザクション ログ サイズに最適な VLF 配布と必要なサイズを得るために必要な増分を決定するには、このスクリプトをご覧ください。