SQLServer 错误 故障 处理 修复 支持远程

详细信息

Attribute
产品名称 SQL Server
事件 ID 856
事件源 MSSQLSERVER
组件 SQLEngine
符号名称 BAD_MEMORY_CLEAN_DATABASE_PAGE
消息正文 SQL Server 检测到数据库“%ls”中的硬件内存损坏(文件 ID 为 %u、页面 ID为 %u、内存地址为0x%I64x),并且已成功恢复页面

说明

此消息指示 SQL Server 在缓冲池外部的缓存对象中检测到错误的内存页面。 在支持从内存错误中恢复的系统上会出现此消息。 SQL Server 通过放弃未修改的损坏内存页面来纠正这些内存错误,并记录此错误消息。 如果损坏的内存页已遭到修改(更新),则会引发错误 824 (MSSQLSERVER_824)

用户操作

应运行硬件或系统检查,确定是否存在内存或 CPU 问题。 确保所有系统驱动程序、操作系统更新和硬件更新均已应用到系统。 考虑运行任何硬件制造商诊断,包括与内存相关的测试。 每次看到此错误时,都请考虑针对此实例中的所有数据库运行 DBCC CHECKDB

详细信息

在具有较新硬件且运行 Windows Server 2012 或更高版本的计算机上,硬件可通知操作系统和应用程序,使其知道内存页面(操作系统页面)已被标记为错误或已损坏。 SQL Server 等应用程序可使用以下 API 集来注册这些“内存页面错误”通知:

  • GetMemoryErrorHandlingCapabilities
  • RegisterBadMemoryNotification
  • BadMemoryCallbackRoutine

SQL Server 在 Microsoft SQL Server 2012 (11.x) 及更高版本中增加了对这些通知的支持。 在 SQL Server 启动过程中,SQL Server 会检查硬件是否支持此新功能。 此外,你会在错误日志中收到以下消息:

<Datetime> 服务器计算机支持内存错误恢复。 会启用 SQL 内存保护以从内存损坏中恢复。

当前,只有当 SQL Server 收到这些通知时,缓冲池才会执行操作。 当它收到通知时,SQL Server 必须遍历整个缓冲池,并发现每个已分配的缓冲区的地址。 然后,SQL Server 使用 QueryWorkingSetEX API 来检查是否有任何支持数据页面的内存页面被标记为错误。 如果报告有任何损坏,则与该内存页面相对应的 PSAPI_WORKING_SET_EX_BLOCK 输出结构会将其成员错误设置为 1。

如果相应缓冲池或数据页面当前未更改或未处理 I/O,则 SQL Server 可放弃并取消提交数据页页面。 然后,SQL Server 会记录以下消息:

SQL Server 检测到数据库“%ls”中的硬件内存损坏(文件 ID 为 %u、页面 ID为 %u、内存地址为0x%I64x),并且已成功恢复页面。

当查询再次需要相应数据页面时,缓冲池可从磁盘读回数据页面,并将内容恢复到缓冲池。 页面的磁盘版本也可能会处于已损坏状态。 在这种情况下,SQL Server 可能会记录其他错误,例如错误 824。

如果错误页面并非由缓冲池使用,而是由某些其他缓存的对象或结构使用,则 SQL Server 会记录以下消息:

检测到无法纠正的硬件内存损坏。 系统可能会变得不稳定。 有关更多详细信息,请查看 Windows 事件日志。

如果服务器报告内存错误,则你应与计算机硬件供应商联系,并执行相应的操作,例如执行内存诊断、更新 BIOS 和固件,以及更换错误的内存模块。

可使用 SQL Server 跟踪标志 849 来阻止 SQL Server 向操作系统注册以获取内存错误通知。 但请注意,启用跟踪标志 849 将阻止 SQL Server 从操作系统接收内存错误通知。 因此,建议不要在典型情况下使用此跟踪标志。

另请注意,默认情况下,SQL Server 将在受支持的硬件上接收这些通知。

还应注意,当 SQL Server 注册以获取这些内存错误通知时,惰性写入器系统进程不会执行固定页面检查。 有关固定页面检查的详细信息,请参阅如何对 SQL Server 中的消息 832(固定页面已更改)进行故障排除


数据运维技术 » SQLServer 错误 故障 处理 修复 支持远程