MSSQLSERVER_9017

适用于: SQL Server(所有受支持的版本)

详细信息

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

说明

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

  • 启动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数据库引擎在内部将每个物理日志文件划分为多个虚拟日志文件, (VFS) 。 SQL Server 2008 R2 Service Pack 2 引入了一条 (9017) 的新消息,该消息是在数据库启动 (时,因为启动SQL Server实例或 由于数据库) 的附加或还原,SQL Server 2008 R2 中有超过 1,000 个 VDF,或者在 SQL Server 中具有超过 10,000 个 VLFS 2012 及更高版本。

注意

在 SQL Server 2012 中,尽管当数据库有 10,000 个 VFS 时记录此消息,但错误日志中报告的实际消息错误地指出“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. 将事务日志文件大小一次性增加到较大的值。 此一次性增加是为了避免频繁的自动增长。 有关详细信息,请参阅 管理事务日志文件的大小

  4. 将 FILEGROWTH 参数增加到比当前配置的值更大的值。 这应基于数据库的活动以及日志文件的增长频率。

  5. 此外,还可以查看以下修补程序文章,具体取决于当前运行的SQL Server版本:

    修复:在 SQL Server 2008 R2、SQL Server 2008 或 SQL Server 2012 中还原数据库需要很长时间

    修复:如果在 2005 SQL Server事务日志中存在多个 VDF,SQL Server 2008 或 SQL Server 2008 R2 中恢复数据库时性能缓慢

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

提示

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