一般的單位都是沒有專職的DBA的,如果沒有可用的備份,更可能是最近一次備份的時間過於久遠而導致不可接受的資料損失,而且你的活動事務日誌也處於不可用的狀態,那就是最麻煩的情況了。不幸的很的是,一般資料庫崩潰都是由於存儲子系統引起的,而這樣的情況是幾乎不可能有可用的日誌用於恢復的。那麽就只好試一下這些方案了。當然,是要求至少你的資料檔案是存在的,要是資料檔案、日誌文件和備份都沒有了的話,別找我,你可以到樓頂上去唱“神啊,救救我吧”。
首先,你可以試一下sp_attach_single_file_db,試著恢復一下你的資料檔案,雖然能恢復的可能性不大,不過假如這個資料庫剛好執行了一個checkpoint的話,還是有可能成功的。如果你沒有好到有摸彩票的手氣,最重要的資料庫沒有像你期盼的那樣attach上去,不要氣餒,還是有別的方案的。我們可以試著重新建立一個log,先把資料庫設置爲emergency mode,sysdatabases的status爲32768 就表示資料庫處於此狀態。不過系統表是不能隨便改的,設置一下先
Use MasterGosp_configure 'allow updates', 1reconfigure with overrideGo
然後
update sysdatabases set status = 32768 where name = '
現在,祈求滿天神佛的保佑吧,重新建立一個log文件。成功的機會還是相當大的,系統一般都會認可你新建立的日誌。如果沒有報告什麽錯誤,現在就可以松一口氣了。雖然資料是恢復了,可是別以爲事情就算完成了,正在進行的事務肯定是丟失了,原來的資料也可能受到一些損壞。先把SQL Server 重新啓動一下,然後檢查你的資料庫吧。先設置成單用戶模式,然後做
dbccsp_dboption '
如果沒有什麽大問題就可以把資料庫狀態改回去了,記得別忘了把系統表的修改選項關掉。
update sysdatabases set status = 28 where name = '
當然你的資料庫狀態可能不是這個,自己改爲合適的值吧。也可以用
sp_resetstatusgosp_configure 'allow updates', 0reconfigure with overrideGocheckdb
的時候可能報告有一些錯誤,這些錯誤的資料你可能就只好丟棄了。checkdb有幾種修復選項,自己看著用吧,不過最後你可能還是得用REPAIR_ALLOW_DATA_LOSS,完成所有修復。chekcdb並不能完成所有的修復,我們需要更進一步的修復,用DBCC CHECKTABLE對每一個表做檢查吧。表的列表可以用sysobjects裏面得到,把OBJECTPROPERTY是IsTable的全部找出來檢查一下吧,這樣能夠基本上解決問題了,如果還報告錯誤,試著把資料select into到另一張表檢查一下。這些都做完了之後,把所有索引、視圖、存儲過程、觸發器等重新建立一下。DBCC DBREINDEX也許可以幫你一些忙。
沒有留言:
張貼留言