針對事件標識碼 50 錯誤訊息進行疑難解答

本文可協助針對事件標識碼 50 錯誤訊息進行疑難解答。

徵狀

當 Windows 將資訊寫入實體磁碟時,可能會在系統記錄檔中記錄下列事件訊息:

事件標識碼:50
事件類型:警告
事件來源:Ftdisk
描述: {遺失 Delayed-Write 數據} 系統嘗試將檔案數據從緩衝區傳輸到 \Device\HarddiskVolume4。 寫入作業失敗,可能只有部分數據已寫入檔案。
資料:
0000: 00 00 04 00 02 00 56 00
0008: 00 00 00 00 32 00 04 80
0010: 00 00 00 00 00 00 00 00
0018: 00 00 00 00 00 00 00 00
0020: 00 00 00 00 00 00 00 00
0028: 11 00 00 80

事件標識碼:26
事件類型:參考
事件來源:應用程式快顯
描述:Windows - 延遲寫入失敗:Windows 無法儲存 \Device\HarddiskVolume4\Program Files\Microsoft SQL Server\MSSQL$INSTANCETWO\LOG\ERRORLOG 檔案的所有數據。 數據已遺失。 此錯誤可能是因為您的電腦硬體或網路連線失敗所造成。

請嘗試將此檔案儲存在別處。

這些事件訊息代表完全相同的內容,並基於相同原因而產生。 本文著重於事件標識碼 50。

注意事項

描述中的裝置和路徑,以及這些訊息中的特定十六進位數據會根據造成事件的確切情況而有所不同。

其他相關資訊

事件標識碼 50 訊息有數個不同的來源。 例如,如果涉及重新導向器的網路連線問題,就會發生從 MRxSmb 來源記錄的事件識別碼 50 訊息。 本文說明參考磁碟寫入問題的事件標識碼 50 訊息。 檢閱事件標識碼 50 訊息,以確認其參考磁碟寫入問題,且本文適用。

在此內容中,如果 Windows 嘗試從文件系統快取管理員寫入資訊,而非硬體層級快取 () 實體磁碟,則 Windows 會記錄事件標識碼 50 訊息。 此寫入行為稱為回寫或延遲寫入快取,是 Windows 記憶體管理功能的一部分。 回寫快取可改善系統效能。 不過,延遲寫入作業中的失敗可能會導致數據遺失或磁碟區完整性。

一般而言,當應用程式將寫入要求傳送至 Windows 時,快取管理員會快取寫入要求,並向應用程式報告寫入成功。 稍後,快取管理員會將數據寫入實體磁碟,然後清除快取。 如果在寫入作業期間發生錯誤,當快取管理員清除快取時,數據就會遺失。

寫入非關鍵數據的應用程式或進程,例如記錄程式,會使用快取管理員來改善整體效能。 寫入重要數據的應用程式,例如 SQL Server,不會使用快取管理員。 這類應用程式會設定 FILE_FLAG_NO_BUFFERING 旗標,以保證交易會直接在磁碟上完成。 直接到磁碟寫入永遠不會產生事件標識碼 50 訊息。

事件標識碼 50 訊息類似於事件標識碼 9 或事件標識碼 11 訊息。 雖然錯誤不像事件標識碼 9 或事件標識碼 11 訊息所指出的錯誤那麼嚴重,但是您可以針對事件標識碼 50 訊息使用與事件標識碼 9 和事件標識碼 11 訊息相同的疑難解答技術。 不過,請記住,堆疊中的任何專案都可能導致遺失延遲寫入,例如篩選驅動程式和迷你埠驅動程式。

譯碼範例事件

The Symptoms section of this article provides the following example of an event ID 50 message:

事件標識碼:50
事件類型:警告
事件來源:Ftdisk
描述: {遺失 Delayed-Write 數據} 系統嘗試將檔案數據從緩衝區傳輸到 \Device\HarddiskVolume4。 寫入作業失敗,可能只有部分數據已寫入檔案。
資料:
0000: 00 00 04 00 02 00 56 00
0008: 00 00 00 00 32 00 04 80
0010: 00 00 00 00 00 00 00 00
0018: 00 00 00 00 00 00 00 00
0020: 00 00 00 00 00 00 00 00
0028: 11 00 00 80

如何識別目標磁碟

您可以使用事件標識碼訊息之 [描述] 區段中針對磁碟驅動器列出的符號連結,來識別寫入作業的目標磁碟,例如: \Device\HarddiskVolume4

如何譯碼數據區段

事件標識碼 50 訊息 (,以及事件標識碼 9、11、51 或類似的「磁碟」訊息) 包含二進位數據,可用來協助識別問題。 此訊息包含下列資料區段:

資料:
0000: 00 00 04 00 02 00 56 00
0008: 00 00 00 00 32 00 04 80
0010: 00 00 00 00 00 00 00 00
0018: 00 00 00 00 00 00 00 00
0020: 00 00 00 00 00 00 00 00
0028: 11 00 00 80

注意事項

當您將事件識別碼訊息中的十六進位資料轉換成狀態代碼時,請記住這些值是以小到大格式表示。

下表描述此訊息的每個位移代表什麼。

OffsetLengthValues 長度
0x00 2 未使用
0x02 2 傾印資料大小 = 0x0004
0x04 2 字串數目 = 0x0002
0x06 2 字串的位移
0x08 2 事件類別
0x0c 4 NTSTATUS 錯誤碼
0x10 8 未使用
0x18 8 未使用
0x20 8 未使用
0x28 4 NT 狀態錯誤碼

NT 狀態錯誤碼

最終狀態代碼是事件標識碼 50 訊息中最重要的資訊片段。 這是在提出寫入要求時傳回的錯誤碼,而它是資訊的重要來源。 在此範例中,最終狀態代碼會列在數據集第六行0x28。 中的 開頭為 “0028:” ,並在此行中包含四個八位:

0028: 11 00 00 80

當您將事件識別碼 50 訊息中的十六進位資料轉換成狀態代碼時,請記住這些值是以小到大的格式表示。 因為狀態代碼是您感興趣的唯一資訊片段,所以以 WORDS 格式而不是 BYTES 檢視數據可能比較容易。 如果您這樣做,位元組會是正確的格式,而且數據可能更容易快速解譯。

若要變更數據檢視,請在 [事件屬性] 視窗中選取 [文字]。 在 [ 數據字詞 ] 檢視中,範例的數據區段會如下所示:

() Bytes (.) 
Words 0000: 00040000 00560002 00000000 80040032 0010: 00000000 00000000 00000000 00000000 0020: 00000000 00000000 80000011

在此情況下,會0x80000011最終狀態代碼。 此狀態代碼對應至 STATUS_DEVICE_BUSY ,表示裝置目前忙碌中。 這是寫入作業失敗的原因。

如需 NT 狀態代碼的詳細資訊,請 參閱使用 NTSTATUS 值。 程式代碼清單也可在NTSTATUS的Windows軟體開發人員套件 (SDK) 中 取得。H 檔案。

事件類別目錄程序代碼

在此範例中,事件類別目錄程式代碼 (與事件標識碼 50 相關聯的程式代碼) 列在第二行。 這一行以 「0008:“ 開頭,並包含下列這一行的最後 4 個字節:

0008: 00 00 00 00 32 00 04 80

在這裡情況下,錯誤碼會0x80040032,其對應於 IO_LOST_DELAYED_WRITE。 此資訊會在事件描述中顯示為「遺失 Delayed-Write 數據」。