[SQL][問題處理]重建已經損毀的 msdb 資料庫
臨時收到一個朋友傳來的訊息,詢問如何重灌 SQL Server ?! 後來細問之下,原來他們的 SQL Server msdb 因為一些硬體異常的原因,造成損毀。之前又沒有對該資料庫備份,在修復幾次都失敗的狀況下,所以才想要重灌 SQL Server。
其實如果只是這樣的狀況,倒是可以不必要那麼麻煩,只需要把 msdb 重建,前後差不多只要花 5mins 的時間,風險也相對小很多,因此想說把相關步驟整理一下,讓他知道該如何來處理囉 !
首先我們先做點手腳,先把 msdb 故意弄壞,讓他不能修復。因此當我們使用 SSMS 的時候,就可能會出現以下的畫面:
因為這個時候如果您在 SSMS 下可能無法利用 GUI 的方式來讀取錯誤紀錄檔, 因此我們用之前另外一篇文章上所介紹的方法「透過 SQL 指令讀取 Log 紀錄」,利用 sp_readerrorlog 的預存程序,查看為什麼 msdb 是無法開啟的。此時從錯誤紀錄檔中看出來,檔案是存在的,只是因為某些原因造成檔案是無法開啟的
這個時候我們就先使用 CMD 的方式來下指令進行關閉資料庫,並且指定啟動參數重新啟動 SQL Server,這裡我們指定 Trace Flag 3608,他的意思是說當我們啟動 SQL Server 的時候,如果有系統資料庫需要進行 recovering,SQL Server只還原 master 的資料庫。
而在啟動之後,我們先下指令把 msdb 的資料庫給卸離,使用 sp_detach_db 的指令。當我們透過 sqlcmd 的工具下了「sp_detach_db 'msdb'」的指令完成之後,後續可以看到我們檢察系統中的資料庫,已經不存在有 msdb 了。
但因為卸離資料庫之後,並不會把實體的資料庫檔案給刪除,因此可能後續我們重建 msdb 的時候會造成失敗,因此再卸離資料庫完成之後,我們需要手動將 msdb 的實體資料檔案給刪除
這個時候我們就可以使用 SSMS 的工具來下指令,重建 msdb 的資料庫了。因此我們在 SSMS 下新增查詢,開啟在 SQL Server 安裝目錄下會有個 Install 目錄,裡面會有個 instmsdb.sql 腳本檔案,我們可以選擇該檔案載入後,並且執行該腳本。
此時應該只需要不到 1mins 的時間,就可以完成資料庫的建立了
此時我們就可以順利的重新啟動 SQL Server 和 SQL Agent,完成一項簡單任務了。
後記 : 這個方法通常是用在 msdb 內沒有重要資料,且沒有備份的狀況下來使用,因此如果有 msdb 的資料庫,或者是可以修復的狀況下,就不用這樣的方式來進行了。