MSSQLSERVER_856

适用于:SQL Server

详细信息

属性
产品名称 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> Server Machine 支持内存错误恢复。 启用 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(固定页面已更改)进行故障排除