事务日志 VLF 对性能有多重要?

the*_*ony 12 performance sql-server transaction-log

在考虑数据库性能时,VLF 有多重要?什么会描述 VLF 的最佳情况?

Sim*_*rts 17

什么是虚拟日志文件?

SQL Server 将每个数据库的事务日志文件分成更小的块,称为“虚拟日志文件”(或简称 VLF)。它们的主要功能是作为日志备份中的截断标记,即 SQL Server 只会清除(并标记为可重复使用)完全为空的 VLF。MSDN 有一篇关于事务日志-物理架构的文章

什么决定了 VLF 的数量?

每次日志文件增长(无论是通过自动增长还是手动增长),日志文件的新部分都会被划分为多个 VLF,完全基于新部分的大小(现有事务日志被单独保留)。因此,小的自动增长设置(即默认的 10% 自动增长)将导致创建大量 VLF。

大量 VLF 的影响是什么?

大量 VLF 导致的主要问题是:

  • 缓慢恢复(恢复是数据库恢复期间的一个阶段,其中已完成的事务被写入数据页,而未完成的事务将被回滚)。
  • 数据库镜像设置中的日志读取器性能缓慢。
  • 创建数据库快照时性能缓慢(请注意,这也包括某些功能,DBCC因为它们在后台使用数据库快照,以便在不阻塞的情况下进行一致性检查)。

如何找出我的数据库有多少个 VLF?

DBCC LOGINFO将为数据库事务日志中的每个 VLF 返回 1 行。这个问题有几个有用的脚本,可以将其应用于服务器上的所有数据库。

多少 VLF 太多了?

这是你必须为自己做出的判断。我个人的经验法则是,低于 50 不值得搞乱,超过 100(左右),我修复了自动增长设置并记下(在下一个维护窗口中)缩小和重新增长日志(如下所示) .

帮助!我有 1100 亿个 VLF,我的数据库恢复需要一整天!

简短大纲(来自Kimberly Tripp 的博客):

  • 确保您是数据库中唯一活动的连接(因此,请在维护窗口期间执行此操作)
  • 将事务日志备份到磁盘(使用BACKUP LOG
  • 运行DBCC SHRINKFILEwithTRUNCATEONLY将日志文件缩小到尽可能小的大小。
  • 运行ALTER DATABASE [...] MODIFY FILE [...] SIZE=newsize以在一个步骤中调整您的事务日志的大小**。

** 注意 - 如果您有一个非常大的日志文件(数十 GB 或更多),您可能需要分多个步骤调整大小以获得适当数量的大小合适的 VLF,以避免过度“笨重”的日志备份。由于 VLF 是截断单位,因此它们还确定日志备份大小,如Kim 的博客中所述