Applies ToMicrosoft SQL Server 2005 Developer Edition Microsoft SQL Server 2005 Enterprise Edition Microsoft SQL Server 2005 Enterprise X64 Edition Microsoft SQL Server 2005 Evaluation Edition SQL Server 2008 Developer SQL Server 2008 Enterprise SQL Server 2008 Standard SQL Server 2008 Standard Edition for Small Business SQL Server 2008 Workgroup SQL Server 2008 R2 Developer SQL Server 2008 R2 Enterprise SQL Server 2008 R2 Standard SQL Server 2008 R2 Workgroup

Microsoft 将 Microsoft SQL Server 2005、2008 和 2008 R2 修补程序分发为一个可下载文件。 由于修补程序是累积的,因此每个新版本都包含所有修补程序和上一SQL Server 2005、2008 和 2008 R2 修复版本中包含的所有安全修补程序。

症状

请考虑以下情况:

  • 在计算机上安装 Microsoft SQL Server 2005、Microsoft SQL Server 2008 或 Microsoft SQL Server 2008 R2。

  • 一个或多个数据库处于完整或批量日志恢复模型中。

  • 数据库的事务日志文件的初始大小较小。 但是,事务文件会变大。

  • 事务日志文件的自动增长增量配置为较小的大小。 例如,自动增长增量配置为 1 兆字节或 1%。 或者,使用少量的手动增长来增加事务日志文件。

  • 事务日志文件以较小的增长增量增长。 一段时间后,事务日志文件很大。例如,事务日志文件从一百兆字节增加到十千兆字节。 事务日志文件在每次增长时都会增长一兆字节。

在此方案中,可能会遇到以下问题:

  • 如果要恢复大量工作,则数据库启动时数据库恢复速度会很慢。例如,事务挂起长时间处于挂起状态。 或者,关闭或重启SQL Server时,不会提交大量大小较小的事务。 在这种情况下,在分析阶段、撤消阶段或重做阶段,可能会在较长的估计恢复时间内收到错误。 该错误类似于以下内容,并记录在 SQL Server 2005 错误日志文件中:

    数据库“mydatabase” (7) 的分析完成率为 0%, (大约 1234 秒仍) 。 这只是一条信息性消息。 无需用户操作。

  • 如果将数据库联机,则数据库恢复速度较慢,如果数据库处于联机状态,则还原完整数据库备份文件和附加事务日志序列。注意,若要在还原操作期间使数据库联机,请使用 WITH RECOVERY 语法或 WITH STANDBY = <选项> 语法。

  • 镜像对中的合作伙伴服务器上的数据库镜像恢复速度缓慢。

  • 对于以下操作,用于事务复制的日志读取器代理的进度缓慢:

    • 将分析发布服务器数据库的事务日志。

    • 命令将添加到分发数据库中。

    • 将复制事务。

  • 如果记录了许多事务或事务日志长时间保持活动状态,则创建数据库快照时,性能会降低。 出现此问题的原因是快照必须运行恢复,并且必须回滚事务日志。

  • 使用 DBCC CHECKDB 语法创建隐藏的数据库快照时,性能会降低,该快照必须完全恢复数据库快照才能运行一致性检查。

原因

出现这些问题的原因是,SQL Server在以下操作中扫描这些 VLF 时,事务日志文件中 (VLF) 的虚拟日志文件可能会导致性能降低:

  • 数据库恢复

  • 数据库镜像

  • 数据库快照

  • 数据库事务复制日志读取器活动

在极端增长条件下,当数据库的事务日志文件以小增量增长时,一组事务日志 (.ldf) 文件中存在数千到数十万个 VLF。 但是,按较大增量进行较大的日志增长仅可通过比较创建多个 VLF。 例如,有几个 VLF 可能小于 100 个 VLF。请注意,VLF 是事务日志文件中SQL Server在内部使用的分区或段。  

解决方法

累积更新信息

SQL Server 2008 R2

此问题的修补程序首次在累积更新 6 中发布。 有关如何获取 SQL Server 2008 R2 的此累积更新包的详细信息,请单击以下文章编号,查看 Microsoft 知识库中的文章:

2489376 SQL Server 2008 R2 说明的累积更新包 6 由于生成是累积的,因此每个新修补程序版本都包含所有修补程序和上一SQL Server 2008 R2 修复版本中包含的所有安全修补程序。 建议考虑应用包含此修补程序的最新修复版本。 有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

981356 SQL Server 2008 R2 发布后发布的 SQL Server 2008 R2 版本

SQL Server 2008 Service Pack 1

此问题的修补程序首次在 2008 Service Pack 1 SQL Server的累积更新 12 中发布。

请注意,由于生成是累积的,因此每个新修补程序版本都包含所有修补程序和上一SQL Server 2008 修复版本中包含的所有安全修补程序。 Microsoft 建议考虑应用包含此修补程序的最新修复版本。 有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

970365 SQL Server 2008 Service Pack 1 发布后发布的 SQL Server 2008 版本 Microsoft SQL Server 2008 修补程序是针对特定SQL Server服务包创建的。 必须将 SQL Server 2008 Service Pack 1 修补程序应用于安装 SQL Server 2008 Service Pack 1。 默认情况下,在SQL Server服务包中提供的任何修补程序都包含在下一个SQL Server服务包中。

SQL Server 2008 Service Pack 2

此问题的修补程序首次在 SQL Server 2008 Service Pack 2 的累积更新 2 中发布。

请注意,由于生成是累积的,因此每个新修补程序版本都包含所有修补程序和上一SQL Server 2008 修复版本中包含的所有安全修补程序。 Microsoft 建议考虑应用包含此修补程序的最新修复版本。 有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

2402659 SQL Server 2008 Service Pack 2 发布后发布的 SQL Server 2008 版本 Microsoft SQL Server 2008 修补程序是针对特定SQL Server服务包创建的。 必须将 SQL Server 2008 Service Pack 2 修补程序应用于安装 SQL Server 2008 Service Pack 2。 默认情况下,在SQL Server服务包中提供的任何修补程序都包含在下一个SQL Server服务包中。

SQL Server 2005 Service Pack 3

此问题的修补程序首次在 2005 Service Pack 3 SQL Server累积更新 13 中发布。

注意,由于生成是累积的,因此每个新修补程序版本都包含所有修补程序和上一个 SQL Server 2005 修复版本中包含的所有安全修补程序。 Microsoft 建议考虑应用包含此修补程序的最新修复版本。 有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

960598 SQL Server 2005 Service Pack 3 发布后发布的 SQL Server 2005 版本 Microsoft SQL Server 2005 修补程序是针对特定SQL Server服务包创建的。 必须将 SQL Server 2005 Service Pack 3 修补程序应用于安装 SQL Server 2005 Service Pack 3。 默认情况下,在SQL Server服务包中提供的任何修补程序都包含在下一个SQL Server服务包中。  

SQL Server 2005 Service Pack 4

此问题的修补程序首次在 SQL Server 2005 Service Pack 4 的累积更新 1 中发布。

注意,由于生成是累积的,因此每个新修补程序版本都包含所有修补程序和上一个 SQL Server 2005 修复版本中包含的所有安全修补程序。 Microsoft 建议考虑应用包含此修补程序的最新修复版本。

必须将 SQL Server 2005 Service Pack 4 修补程序应用于安装 SQL Server 2005 Service Pack 4。 默认情况下,在SQL Server服务包中提供的任何修补程序都包含在下一个SQL Server服务包中。

状态

Microsoft 已经确认这是一个列于“适用范围”部分的 Microsoft 产品问题。

解决方法

安装此修补程序并重启SQL Server可能会提高恢复性能。 例如,安装此修补程序并重新启动SQL Server后,可能会提高以下操作的性能:

  • 数据库恢复

  • 数据库镜像

  • 数据库快照

  • 数据库事务复制日志读取器活动

如果无法安装此修补程序,可以执行以下解决方法来缓解现有问题并防止将来发生。

缓解现有问题

  • 等待还原或恢复操作完成 如果有一个未恢复的数据库在还原或恢复数据库时性能缓慢,则可能需要等待还原或恢复操作完成。 例如,你可能会在未恢复的数据库的 SSMS) SQL Server Management Studio (中看到脱机状态或恢复状态。 停止SQL Server通常不会缓解缓慢恢复,可能需要更多时间来重复相同的恢复分析阶段、重做阶段或撤消阶段。

  • 避免还原包含数千个 VLF 的事务日志序列 如果在使用备份文件还原和恢复数据库时遇到性能缓慢,则可以避免还原包含数千个 VLF 的事务日志序列。 若要标识记录的虚拟日志文件最多的备份文件,请使用以下语句查看日志备份文件中的 FirstLSNLastLSN 列: RESTORE HEADERONLY FROM DISK='C:\folder\file.trn' 可以决定避免还原日志备份文件。 或者,可以使用 RESTORE 命令中的 STOP AT 语句来避免事务日志中高度分散的部分。 如果在故障恢复方案中未将日志序列完全还原到最新时间点,则数据库SQL Server中会发生数据丢失。 发生此数据丢失的原因是并非所有事务都处于保留状态。 因此,有一个商业权衡决定。 可以完全还原高度分散的事务日志。 但是,此操作可能需要数小时。 或者,可以在恢复过程中使用 STOP AT 语句在日志高度碎片化部分之前停止恢复。 但是,省略的任何缺失事务将丢失。请注意,如果未安装此修补程序,则重启SQL Server后,通常没有用于加速恢复的安全追索权。 SQL Server必须找到 VLF 列表来分析日志文件、重做已完成的事务,然后撤消不完整的事务才能完成恢复,使数据库安全联机。 无法在恢复期间安全跳过事务。

防止将来发生

  • 将数据库的自动增长增量设置为适当的大小 如果自动增长增量的大小太小,将有许多虚拟日志文件 (VLF) ,并且可能会在SQL Server中遇到性能缓慢的问题。 如果自动增长增量的大小太大,则使事务日志自动增长的查询可能需要等待很长时间才能完成增长。 因此,SQL Server中可能会出现超时错误。 若要解决这些问题,可以将数据库的自动增长增量大小设置为适当的大小。

  • 消除大量 VLF,并使用手动增长 如果事务日志中包含许多 VLF,请减小事务日志的大小,并使其在高峰业务之前增加,以使用手动增长来满足需求。 例如,事务日志以较大的增量或单个手动增长将重新增加到合理的平均大小。 因此,事务日志的大小达到峰值容量,日志备份文件会定期计划。 此外,事务日志可能会被截断,事务日志的 VLF 可以在一个周期中重复使用。

  • 如何手动收缩和增加事务日志 若要更正 VLF 过多的日志,请按照以下步骤收缩日志并再次手动增加日志:

    1. 如果数据库处于完整或批量日志恢复模型中,则必须备份事务日志以允许截断活动 VLF 并重复使用。BACKUP LOG databasename TO DISK='C:\folder\log_backupfile.trn' 有关如何使用 SSMS 备份事务日志文件的详细信息,请访问以下 Microsoft 开发人员网络 (MSDN) 网站:

      如何使用 SSMS 备份事务日志文件有关如何使用 Transact-SQL 语句备份事务日志文件的详细信息,请访问以下 MSDN 网站:

      如何使用 Transact-SQL 语句备份事务日志文件

    2. 若要确定事务日志文件的逻辑名称,请运行以下语句之一。语句 1 exec sp_helpfile 语句 2 从 sys.sysfiles 中选择 * 若要将事务日志文件的大小减小到所需的大小,请使用以下代码:DBCC SHRINKFILE (transactionloglogicalfilename、TRUNCATEONLY)

    3. 可以将事务日志文件的大小增加到适当的大小。 建议让事务日志文件的大小增长到正常大小的峰值。 因此,避免自动增长增量。 若要设置事务日志的大小,请在 SSMS 中使用 “数据库属性” 页,或使用以下 ALTER DATABASE 语法:MODIFY FILE ( NAME = transactionloglogicalfilenae,SIZE=newtotalsize MB) 有关如何在 SSMS 中增加数据库大小的详细信息,请访问以下 MSDN 网站:

      如何在 SSMS 中增加数据库的大小有关 ALTER DATABASE MODIFY FILE 语法的详细信息,请访问以下 MSDN 网站:

      有关 ALTER DATABASE MODIFY FILE 语法的一般信息

更多信息

可以通过查看 SQL 错误日志文件,然后在每个事务日志备份文件中查找 (LSN) 的日志序列号来检查 VLF 段数。 LSN 中冒号前的第一个数字对应于 LSN 的数量。例如,LSN 的第一条信息性消息中的第一个数字是 1。 但是,LSN 的第二条信息性消息中的第一个数字是100001。 在此方案中,在第一条信息性消息和第二条信息性消息的时间之间使用 100,000 个 VLF。 因此,具有多个虚拟日志文件 (VLF 的记录碎片事务日志) 如下所示:  

{Log 已备份。 数据库:mydbname,创建日期 (时间) :2010/07/08 (12:36:46) , first LSN: 1:5068:70, last LSN: 1:5108:1, 转储设备数: 1, 设备信息: (FILE=1, TYPE=DISK: {'C:\folder\logbackup1.trn'}) . 这只是一条信息性消息。 无需用户操作。日志已备份。 数据库:mydbname,创建日期 (时间) :2010/07/08 (15:36:46) , first LSN: 100001:5108:1, last LSN: 100002:5108:1, 转储设备数: 1, 设备信息: (FILE=2, TYPE=DISK: {'C:\folder\logbackup2.trn'}) 。 这只是一条信息性消息。 无需用户操作。} 下表提供了有关产品或工具的详细信息,这些产品或工具会自动检查SQL Server实例中的“症状”部分中所述的条件,以及针对其评估规则的SQL Server版本。  

规则软件

规则标题

规则说明

针对其评估规则的产品版本

System Center Advisor

SQL Server事务复制时,日志读取器代理性能可能会因事务日志大小或 VLF 数而受到影响

在此SQL Server实例顾问检测到 VLF 或 TLOG 大小明显增加的状态事务复制。 日志读取器代理性能受到事务日志大小或 VLF 数的负面影响。 减少事务日志大小和 VLF 数,以提高日志读取器代理性能。

SQL Server 2008SQL Server 2008 R2SQL Server 2012

 

参考

有关事务日志的物理体系结构的详细信息,请访问以下 MSDN 网站:

有关事务日志 的物理体系结构的一般信息 有关 LSN) (日志序列号的详细信息,请访问以下 MSDN 网站:

有关日志序列号的 一般信息 有关数据库镜像启动时的 1413 错误的详细信息,请访问以下 MSDN 网站:

数据库镜像启动 时的 1413 错误的一般信息 有关日志文件结构如何影响数据库恢复时间的详细信息,请访问以下 MSDN 网站:

日志文件结构如何影响数据库恢复时间 有关事务日志 VLF 的详细信息,请访问以下 MSDN 网站:

有关事务日志文件 的一般信息 有关如何创建数据库快照的详细信息,请访问以下 MSDN 网站:

如何创建数据库快照有关SQL Server的增量服务模型的详细信息,请单击以下文章编号以查看 Microsoft 知识库中的文章:

935897 SQL Server团队提供了增量服务模型,用于为报告的问题提供修补程序。有关SQL Server更新的命名架构的详细信息,请单击以下文章编号以查看 Microsoft 知识库中的文章:

822499Microsoft SQL Server软件更新包的新命名架构有关软件更新术语的详细信息,请单击以下文章编号以查看 Microsoft 知识库中的文章:

824684 有关用于描述 Microsoft 软件更新标准术语的说明

需要更多帮助?

需要更多选项?

了解订阅权益、浏览培训课程、了解如何保护设备等。

社区可帮助你提出和回答问题、提供反馈,并听取经验丰富专家的意见。