MSSQLSERVER_9017
适用范围:SQL Server
详细信息
Attribute | 值 |
---|---|
产品名称 | SQL Server |
事件 ID | 9017 |
事件来源 | MSSQLSERVER |
组件 | SQLEngine |
符号名称 | LOG_MANY_VLFS |
消息正文 | 数据库 %ls 的虚拟日志文件数超过 %d,过多。 过多的虚拟日志文件可能会导致长时间的启动和备份时间。 请考虑收缩日志并使用不同的增长增量来减少虚拟日志文件的数量。 |
说明
在数据库启动期间,SQL Server 检测到数据库具有大量 虚拟日志文件 (VDF),并记录此错误消息。 可能会遇到错误的情况如下:
- 启动 SQL Server 实例时
- 还原数据库
- 附加数据库
SQL Server 错误日志中记录了类似于此示例的 9017 信息性消息:
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 实例的启动,还是由于附加或还原) 数据库的 SQL Server 2008 R2 中具有 1,000 多个 VDF,或者 SQL Server 2012 及更高版本中有超过 10,000 个 VLFS。
注意
在 SQL Server 2012 中,尽管数据库有 10,000 个 VDF 时记录此消息,但错误日志中报告的实际消息错误地指出“1000 VLF”。该警告在 10,000 个 VDF 之后发生。 但是,消息报告 1,000 个 VDF。 此问题在更高版本中得到更正。
用户操作
若要解决该问题,请执行以下步骤:
可以使用此查询查看 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。
使用 DBCC SHRINKDB/DBCC SHRINKFILE 或使用 SQL Server Management Studio 减少事务日志。
将事务日志文件大小的一次性增大到较大的值。 这种一次性增加是为了避免频繁的自动增长。 有关详细信息,请参阅 管理事务日志文件的大小。
将 FILEGROWTH 参数增加到大于当前配置的值。 这应基于数据库的活动以及日志文件增长的频率。
此外,还可以查看以下修补程序文章,具体取决于当前运行的 SQL Server 版本:
修复:在 SQL Server 2008 R2、SQL Server 2008 或 SQL Server 2012 中还原数据库需要很长时间
修复:如果 SQL Server 2005、SQL Server 2008 或 SQL Server 2008 R2 中的事务日志中存在许多 VDF,则恢复数据库时性能降低
提示
若要确定给定实例中所有数据库的当前事务日志大小的最佳 VLF 分发,以及实现所需大小需要的增长量,请参阅此脚本。