症状
假设启用了在 Microsoft SQL Server 2012 或 Microsoft SQL Server 2014 的实例中使用日志池的 AlwaysOn 可用性组等功能。 在这种情况下,SQL Server 实例上日志缓冲区的日志写入等待计数器具有较高的值。 您还将注意到动态管理视图 (DMV) 中 CMEMTHREAD 和 WRITELOG 等待类型的高值。 此外,还会生成微型转储文件。
注意:日志池是事务日志的内存中缓存。 此缓存的用途包括:优化恢复期间对日志的读取、事务复制中的回滚操作,以及 AlwaysOn 可用性组功能。
原因
出现此问题的原因是日志池使用指向所有数据库的 PMO) (内存对象的全局指针。
当许多线程尝试使用日志池写入日志时,所有线程都必须等待指向内存对象的指针,从而导致“症状”部分中描述的争用。
解决方法
SQL Server 2014 Service Pack 1
默认情况下,适用于 SQL Server 2014 的 Service Pack 1 包含此修补程序,您无需添加任何跟踪标志即可启用该修补程序。
SQL Server 2014
此问题已在 SQL Server 2014 的 RTM 版本中修复,但仍需要启用跟踪标志 T9024 和/或 8048 才能激活修补程序。 启用此跟踪标志后,SQL Server 实例将在节点级别对指向内存对象的指针进行分区。
便笺
- 如果在启用跟踪标志 T9024 后问题仍然存在,还可以启用跟踪标志 T8048,它在 CPU 级别对指向内存对象的指针进行分区。
- SQL Server 2014 Service Pack 1 (SP1) 包含此修补程序,您不必启用跟踪标志。
SQL Server 2012
请注意SQL Server 2012 Service Pack 3 (SP3) 包含此修补程序,您不必启用跟踪标志。
累积更新信息
SQL Server 2012 SP1 累积更新 3
此问题的修补程序已在累积更新 3 中首次发布。 有关如何获取 SQL Server 2012 SP1 的此累积更新程序包的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
2812412 SQL Server 2012 Service Pack 1 累积更新包 3 注意 由于版本是累积的,因此每个新的修补程序版本都包含前一个 SQL Server 2012 SP1 修补程序版本中包含的所有修补程序和所有安全修补程序。 建议应用包含此修补程序的最新修补程序版本。 有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
2772858 在 SQL Server 2012 Service Pack 1 发布之后发布的 SQL Server 2012 内部版本注意:应用修补程序后,必须启用跟踪标志 T9024 才能激活修补程序。 启用此跟踪标志后,SQL Server 实例将在节点级别对指向内存对象的指针进行分区。
注意:如果在启用跟踪标志 T9024 后问题仍然存在,还可以启用跟踪标志 T8048,它在 CPU 级别对指向内存对象的指针进行分区。
修补程序信息
Microsoft 提供了一个受支持的修补程序。 但此程序只用于解决本文中提到的问题。 仅将此修补程序应用于遇到此特定问题的系统。
如果修补程序可供下载,则本知识库文章顶部的“修补程序下载可用”部分。 如果此部分不存在,请向 Microsoft 客户服务和支持部门提交请求以获取该修补程序。
注意 如果发生其他问题或需要进行任何故障排除,您应该另行创建服务请求。 对于此特定修补程序无法解决的其他支持问题和事项,将照常收取支持费用。 若要获取 Microsoft 客户服务和支持部门的完整电话号码列表或另行创建服务请求,请访问以下 Microsoft 网站:
/contactus/?ws=support 注意 “修补程序下载可用”窗体显示了修补程序的可用语言版本。 如果您找不到需要的语言,则说明该语言版本的修补程序未提供。
SQL Server 2012 的先决条件
若要应用此修补程序,必须在计算机上安装 SQL Server 2012 SP1。
重启要求
应用此修补程序后,无需重启计算机。 必须使用跟踪标志 T9024 重新启动 SQL Server。 有关如何使用启动跟踪标志配置 SQL Server 的详细信息,请参阅数据库引擎服务启动选项。
文件信息
此全局修补程序版本具有下表列出的文件属性 (或更高版本的文件属性) 。 这些文件的日期和时间以协调世界时 (UTC) 格式列出。 在查看文件信息时,文件时间将转换为本地时间。 要了解 UTC 与本地时间之间的时差,请使用“控制面板”中“日期和时间”项中的“时区”选项卡。