MSSQLSERVER_9017

適用対象:SQL Server

詳細

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

説明

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

  • 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 テクノロジを使用している場合は、これらのテクノロジのパフォーマンスの問題が発生する可能性があります。

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

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

原因

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

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

Note

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

ユーザー アクション

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

  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 のトランザクション ログ内に多数の VDF がある場合、データベースを復旧するとパフォーマンスが低下する

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

ヒント

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