MSSQLSERVER_9017

适用于:SQL Server

详细信息

Attribute
产品名称 SQL Server
事件 ID 9017
事件源 MSSQLSERVER
组件 SQLEngine
符号名称 LOG_MANY_VLFS
消息正文 数据库 %ls 包含的虚拟日志文件超过 %d,这过多。 虚拟日志文件过多可能会导致启动和备份时间过长。 请考虑收缩日志并使用不同的增长增量来减少虚拟日志文件的数量。

说明

在数据库启动期间,SQL Server检测到数据库具有大量虚拟日志文件, (VLF) 并记录此错误消息。 遇到错误的情况包括:

  • 启动 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 技术,你可能会注意到这些技术的性能问题。

许多 VLF 对复制的影响

日志文件过多可能会影响复制,因为日志读取器进程必须扫描每个虚拟日志文件,以查找标记为要复制的事务。 可以通过跟踪sp_replcmds存储过程的性能来查看此行为。 日志读取器进程使用 sp_replcmds 存储过程扫描虚拟日志文件并读取标记为复制的事务。

原因

如果为事务日志文件的 FILEGROWTH 参数指定较小的值, () ,则会出现此问题。

SQL Server数据库引擎在内部将每个物理日志文件划分为多个虚拟日志文件, (VLF) 。 SQL Server 2008 R2 Service Pack 2 引入了 (9017) 的新消息,该消息在数据库启动时 (由于启动 SQL Server 实例或 因为数据库) 附加或还原,SQL Server 2008 R2 中有超过 1,000 个 VLF,或者在 SQL Server 2012 及更高版本。

注意

在 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. 将事务日志文件大小一次性增大到较大的值。 这种一次性增加是为了避免频繁的自动增长。 有关详细信息,请参阅 管理事务日志文件的大小

  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 中的事务日志中存在多个 VLF,则恢复数据库时性能降低

    修复:在 SQL Server 2008 或 SQL Server 2008 R2 环境中恢复数据库所需的时间比预期要长

提示

若要确定给定实例中所有数据库的当前事务日志大小的最佳 VLF 分发,以及实现所需大小需要的增长量,请参阅此脚本