可怕錯誤訊息 The operating system returned the error '21(裝置未就緒。)

今天一早例行性檢查前一天的Error Log,赫然發現一個沒看過的錯誤訊息,訊息如下The operating system returned the error '21(裝置未就緒。)' while attempting 'GetDiskFreeSpace' on 'A:\'.
 

這訊息讓人看起來很毛,感覺就是跟磁碟有關的錯誤。由於沒看過這樣的訊息,所以先關鍵字谷歌一下,很幸運的找到一篇文章

其原因就是SQL2017有一個新的DMV叫 sys.dm_os_enumerate_fixed_drives 該DMV應該是取代舊的 xp_fixeddrives 功能來撈取磁碟機的可用空間,然而不知為何當SQL2017查詢該DMV時,如軟碟機跟光碟機內部無任何碟片狀態下就會讓SQL產出一筆錯誤訊息的紀錄,也就是我上面寫的錯誤訊息。

以下簡單測試,下圖是我錯誤訊息

接下來我故意查詢該DMV sys.dm_os_enumerate_fixed_drives,我們可以看見查詢結果回報了一個訊息會顯示A磁碟裝置未就緒。

這時錯誤紀錄檔也增加了一筆錯誤紀錄,因此可以證實該錯誤是因為查詢了sys.dm_os_enumerate_fixed_drives這一個DMV。

我回想一下昨天該時段我做了甚麼動作會導致SQL去查詢該DMV呢? 後來想到昨天該時段我因為需還原資料庫,用了SSMS開啟還原GUI介面。因此我開了Profiler來側錄一下是否真是這原因呢?
結果如下圖所示,當我用SSMS的資料庫還原GUI時,SQL會根據需求(我用測試機測試時,SQL並不會查詢該DMV,但我測試機較單純只有一顆磁碟)進而用該DMV去抓取所需資料。

這個錯誤訊息看起來應該無害可以忽略,但如果你堅持不想看到該訊息要如何做呢? 如果你的A磁碟根本沒用那就在裝置管理員停用吧,如下圖所示。

停用A磁碟機後我再次查詢該DMV,如下圖所示這次就沒有再跳出裝置未就緒的訊息了。

我測試了一下SQL2019後發現該問題依然存在,但我覺得這個錯誤訊息是可以忽略。

 

 

我是ROCK

rockchang@mails.fju.edu.tw