共用方式為


MSSQLSERVER_856

適用於:SQL Server

詳細資料

屬性
產品名稱 SQL Server
事件識別碼 856
事件來源 MSSQLSERVER
元件 SQLEngine
符號名稱 BAD_MEMORY_CLEAN_DATABASE_PAGE
訊息文字 SQL Server 偵測到資料庫 '%ls' 中的硬體記憶體損毀,檔案標識碼: %u,頁面標識符;%u,記憶體位址:0x%I64x 且已成功復原頁面

說明

此訊息表示 SQL Server 偵測到緩衝池外部快取物件的記憶體錯誤頁面。 此訊息會在支援從記憶體錯誤復原的系統上引發。 SQL Server 會捨棄未修改的損毀記憶體頁面,並記錄此錯誤訊息,以更正這些記憶體錯誤。 如果損毀的記憶體頁面已修改 (dirty),則會引發錯誤 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' 中的硬體記憶體損毀,檔案標識碼: %u,頁面標識符;%u,記憶體位址:0x%I64x,且已成功復原頁面。

當查詢再次要求該數據頁時,緩衝池可以從磁碟讀取數據頁面,並將內容帶回緩衝池。 頁面的磁碟上版本也可能處於損毀狀態。 在此情況下,SQL Server 可能會記錄其他錯誤,例如錯誤 824。

如果緩衝池未使用錯誤的頁面,但由其他快取對象或結構使用,SQL Server 會記錄下列訊息:

偵測到無法更正的硬體記憶體損毀。 您的系統可能會變得不穩定。 如需詳細資訊,請參閱 Windows 事件記錄檔。

如果伺服器報告記憶體錯誤,您應該連絡計算機硬體廠商,並執行適當的動作,例如執行記憶體診斷、更新 BIOS 和韌體,以及取代不正確的記憶體模組。

您可以使用 SQL Server 追蹤旗標 849 來防止 SQL Server 向作業系統註冊記憶體錯誤通知。 不過,請注意,啟用追蹤旗標 849 會防止 SQL Server 從操作系統接收不正確的記憶體通知。 因此,不建議在一般情況下使用此追蹤旗標。

此外,請注意,根據預設,SQL Server 會在支援的硬體上收到這些通知。

您也應該注意,當 SQL Server 註冊這些記憶體錯誤通知時,延遲寫入器系統進程不會執行常數頁面檢查。 如需常數頁面檢查的詳細資訊,請參閱 如何在 SQL Server 中針對 Msg 832(常數頁面已變更)進行疑難解答。