[SQL]即刻救援 ! 搶救因為 master 資料庫損毀而不能啟動的 SQL Server

對於 SQL Server 來說,在可以啟動的狀況下,損毀的資料庫都可以靠備份來還原,但要是 SQL Server 無法啟動,那狀況就有點麻煩了。

一大早還在煩惱早餐要吃甚麼的時候,一個老朋友傳來一個訊息說 SQL Server 沒有辦法啟動,因此連線查看一下。透過在命令列下啟動 SQL Server,可以看到以下的訊息。

從訊息和其他的錯誤資訊中可以發現,應該是磁碟快取的問題造成 master 資料庫 LDF 寫入和 MDF 的不一致,也因為 SQL Server 沒有正常啟動起來,因此不確定其他的資料庫是否也有類似的情況,因此要正常啟動之後才有辦法來做檢查。

因為救援的過程遠端連線,加上又有許多朋友家的機密資料,因此就不展示朋友的環境,我就自己來做一個模擬的情境,展示 master 資料庫的還原處理。

假設我有一個 SQL Server 2008R2 的環境,這個環境中有一些範例的資料庫和範例的帳號,並且先將 master 的資料庫給做一個備份。

接下來我故意先把 SQL Server 的服務給停止,使用 Hex Editor 的程式來竄改 SQL Server 的 mastlog.ldf 檔案,來模擬一個損壞 master 資料庫。

接下來當我再度啟動 SQL Server 的時候,就會類似之前案例發現沒有辦法啟動 SQL Server ( 雖然錯誤代號有點不同,反正都是 master 資料庫損毀無法啟動 )

在這裡當我們查看 ERROR LOG 的時候要注意一點,要注意一下 SQL Server 的版本,還有原本系統是把 SQL Server 安裝在哪裡,這裡都要稍微注意一下。

看到這裡或許有朋友會想說使用 -m -f 的參數看起否能強迫啟動

但是看起來還是沒有辦法啟動,那沒有辦法啟動我們怎麼來還原 master 資料庫呢 ?


這個時候我們可以找另外一個環境,也安裝起來同樣一套版本的 SQL Server,主要是因為當我們還原 master 的備份檔案之後,要把還原出來的檔案拿回到舊的 SQL Server 上面使用,如果版本沒有一致會造成無法還原或者是無法使用的狀況發生。

在這裡我們先把原本的 master 的資料庫備份檔案給還原,當然不能也叫做 master,所以還原的時候我們指定資料庫名稱為 fixed_master ( 反正只要名稱不要重複,你想指定甚麼都可以 )

還原出來之後,我們在這台上面將剛剛還原的 fixed_master 資料庫給卸離。

卸離完成之後,因為剛才我們命名還原出來的資料庫是  fixed_master,因此我們應該會有 fixed_master.mdf 和 fixed_master.ldf 這兩個檔案。

此時我們回到原本有問題的那台 SQL Server,我們將剛剛的那兩個檔案給更名,將 fixed_master.mdf 改成 master.mdf,另外也把 fixed_master.ldf 改成 mastlog.ldf ,這裡要稍微注意一下,不要改錯名稱,然後將那兩個檔案給覆蓋掉原本有異常的 master 資料庫的檔案

如果您不想破壞原本的檔案,也是可以在組態管理員下面去調整 SQL Server 的啟動參數,讓 SQL Server 啟動的時候載入不同路徑或名稱的 master 資料庫檔案,就看您自己的選擇了。

此時一切完工之後,我們再重新啟動 SQL Server,就可以看到原本的資料庫和帳號也都有存在了,可以恢復正常的使用了。


一般當可以這樣救援回來之後,通常要在特別注意一下,通常這是告訴您硬體環境應該是有出一些狀況了,或許應該再多做一些檢查,否則可能下次整個磁碟故障,那就得不償失了。