2011年10月15日 星期六

如何修復一個 Suspect Database

        最近接到一個Case,由於客戶的資料庫清單開啟後,就看到其中的一個資料庫 cary_db (匿名) 的狀態有問題,變成 Suspect,而且資料庫也打不開,所以請我們協助,當然最先的動作還是先了解客戶資料庫備份計畫,因為在這種情況下,應該沒有人可以100%的保證資料可以完全的還原,所以至少先確認如果修復失敗後,還有檔案可以還原,在這個Case中,很可惜的,也是什麼都沒有,當然我想這是最差的情況了,所以接下來只好進行修復,動作如下。

資料庫版本:SQL Server 2005

底下以cary_db為卻修復的資料庫為列:

1、如果可以的話請先停止服務並進行資料庫(cary_db.mdf與cary_db_log.ldf)的備份。

預設目錄:
C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\

2、由於資料庫狀態為 Suspect ,所以可以透過將資料庫切換成 Emergency,讓資料庫可以進行唯讀存取與修復。

Use master
go
Alter database cary_db set emergency
go

3、由於需要進行資料庫修復,所以先將資料庫切換成單人模式。

Alter database cary_db set single_user
go

4、再來就是透過checkdb來進行資料庫修復,在參數上有兩種常用的方法,建議大家可以先用 [REPAIR_REBUILD] 指令來修復,如果執行完成後仍然有錯時,才會使用[REPAIR_ALLOW_DATA_LOSS] 的指令來執行,因為此指令可能會造成資料的遺失,所以千萬注意,而執行完成後,需確認是否有錯誤訊息顯示。

DBCC checkdb(cary_db ,REPAIR_REBUILD ||  REPAIR_ALLOW_DATA_LOSS)
go

5、由於已修復完成,所以將資料庫的狀態切回原本的正常狀態。

Alter DATABASE cary_db SET ONLINE
go

6、再將資料庫切換回多人使用模式
Alter DATABASE cary_db SET multi_user
go

最後,在這次的修復過程中,運氣算是還滿好的,因為也沒有任何的錯誤訊息,算是完整修復,而且也沒有資料遺失,但坦白說不是每一次的運氣都會這麼的好,還是建議大家設定好你的備份計畫,這才是上上之策。

資料庫狀態
狀態定義
ONLINE資料庫可供存取。主要檔案群組是在線上,雖然可能尚未完成復原的恢復階段。
OFFLINE資料庫是無法使用的。明確的使用者動作可使資料庫變成離線狀態,並且在採取其他的使用者動作之前都是離線狀態。例如,可以將資料庫設成離線,好讓檔案移到新的磁碟中。在完成移動後,就會將資料庫重新啟動為線上狀態。
RESTORING在離線狀態還原主要檔案群組的一或多個檔案,或還原一或多個次要檔案。資料庫是無法使用的。
RECOVERING資料庫復原中。復原程序是暫時性的狀態;如果復原成功,資料庫就會自動變成線上狀態。如果復原失敗,資料庫就會變成有疑問的狀態。資料庫是無法使用的。
RECOVERY PENDINGSQL Server 在復原期間發生資源相關的錯誤。資料庫並未損毀,但是檔案有可能遺失或系統資源限制有可能造成它無法啟動。資料庫是無法使用的。需要使用者執行其他動作以解決錯誤並讓復原處理得以完成。
SUSPECT至少主要檔案群組為有疑問的,而且有可能會損毀。資料庫在 SQL Server 啟動期間無法復原資料庫。資料庫是無法使用的。需要使用者執行其他動作來解決問題。
EMERGENCY使用者已變更資料庫並將狀態設為 EMERGENCY。資料庫是在單一使用者模式下,而且可以進行修復或還原。資料庫是標示為 READ_ONLY、記錄已停用並限定只有系統管理員 (sysadmin) 固定伺服器角色的成員才可存取。EMERGENCY 主要是做為疑難排解的用途。例如,標示為有疑問的資料庫可以設為 EMERGENCY 狀態。這將可允許系統管理員唯讀存取資料庫。只有系統管理員 (sysadmin) 固定伺服器角色的成員,可以將 資料庫設定為 EMERGENCY 狀態。

相關文章:
SQL Server 最佳案例 - 如何修復一個有問題的資料庫 (Suspect Database) http://caryhsu.blogspot.com/2011/07/sql-server-suspect-database.html
有效維護資料庫的最佳秘訣
http://caryhsu.blogspot.com/2011/04/blog-post.html

參考資源:
資料庫狀態
http://msdn.microsoft.com/zh-tw/library/ms190442.aspx

關鍵字:SQL ServerSuspectEmergencyRecoveryDatabase State、REPAIR_REBUILDREPAIR_ALLOW_DATA_LOSS

沒有留言:

張貼留言