SQL Server 數據庫崩潰後的恢復之法


SQL Server 數據庫崩潰後的恢復之法
任何數據庫系統都無法避免崩潰的狀況,即使你使用了Clustered,雙機熱備……仍然無法完全根除系統中的單點故障,何況對於大部分用戶來說,無法承受這樣昂貴的硬件投資。所以,在系統崩潰的時候,如何恢復原有的寶貴數據就成爲一個極其重要的問題了。
在恢復的時候,最理想的情況就是你的數據文件和日誌文件都完好無損了,這樣只需要sp_attach_db,把數據文件附加到新的數據庫上即可,或者在停機的時候把所有數據文件(一定要有master等)都copy到原有路徑下也行,不過一般不推薦這樣的做法,sp_attach_db比較好,雖然麻煩許多。

但是呢,一般數據庫崩潰的時候系統是未必能有時間把未完成的事務和髒頁等寫入磁盤的,這樣的情況sp_attach_db就會失敗。那麼,寄期望於DBA制定了一個良好的災難恢復計劃吧。按照你的恢復計劃,還原最新的完全備份,增量備份或者事務日誌備份,然後如果你的活動事務日誌還能讀得出來的話,這樣的話你可以還原到崩潰前的狀態。

一般的單位都是沒有專職的DBA的,如果沒有可用的備份,更可能是最近一次備份的時間過於久遠而導致不可接受的數據損失,而且你的活動事務日誌也處於不可用的狀態,那就是最麻煩的情況了。

不幸的是,一般數據庫崩潰都是由於存儲子系統引起的,而這樣的情況是幾乎不可能有可用的日誌用於恢復的。

首先,你可以試一下sp_attach_single_file_db,試着恢復一下你的數據文件,雖然能恢復的可能性不大,不過假如這個數據庫剛好執行了一個checkpoint的話,還是有可能成功的。

我們可以試着重新建立一個Log,先把數據庫設置爲emergency mode,sysdatabases的status爲32768 就表示數據庫處於此狀態。

不過系統表是不能隨便改的,設置一下先Use MasterGosp_configure 'allow updates', 1reconfigure with overrideGo然後 update sysdatabases set status = 32768 where name = '' 現在,祈求滿天神佛的保佑吧,重新建立一個log文件。成功的機會還是相當大的,系統一般都會認可你新建立的日誌。如果沒有報告什麼錯誤,現在就可以鬆一口氣了。

雖然數據是恢復了,可是別以爲事情就算完成了,正在進行的事務肯定是丟失了,原來的數據也可能受到一些損壞:

先把SQL Server 重新啓動一下,然後檢查你的數據庫吧;

先設置成單用戶模式,然後做dbcc sp_dboption '', 'single user', 'true'DBCC CHECKDB('');

如果沒有什麼大問題就可以把數據庫狀態改回去了,記得別忘了把系統表的修改選項關掉。update sysdatabases set status = 28 where name = '' ,當然你的數據庫狀態可能不是這個,自己改爲合適的值吧。也可以用:

sp_resetstatusgosp_configure 'allow updates', 0reconfigure with overrideGo

checkdb的時候可能報告有一些錯誤,這些錯誤的數據你可能就只好丟棄了;checkdb有幾種修復選項,自己看着用吧,不過最後你可能還是得REPAIR_ALLOW_DATA_LOSS,完成所有修復;chekcdb並不能完成所有的修復,我們需要更進一步的修復,用DBCC CHECKTABLE對每一個表做檢查吧。

表的列表可以用sysobjects裏面得到,把OBJECTPROPERTY是IsTable的全部找出來檢查一下吧,這樣能夠基本上解決問題了,如果還報告錯誤,試着把數據select into到另一張表檢查一下。

這些都做完了之後,把所有索引、視圖、存儲過程、觸發器等重新建立一下。可以從DBCC DBREINDEX得到幫助。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章