SQL Server 崩潰的恢復(fù)方法
以下的文章主要向大家描述的是SQL Server 崩潰的恢復(fù)方法,我們大家都知道任何數(shù)據(jù)庫系統(tǒng)在實際操作中都會遭遇SQL Server 數(shù)據(jù)庫崩潰的這一狀況,即使你使用了Clustered,雙機熱備……仍然無法完全根除系統(tǒng)中的單點故障。
何況對于大部分用戶來說,無法承受這樣昂貴的硬件投資。所以,在系統(tǒng)崩潰的時候,如何恢復(fù)原有的寶貴數(shù)據(jù)就成為一個極其重要的問題了。
在恢復(fù)的時候,最理想的情況就是你的數(shù)據(jù)文件和日志文件都完好無損了,這樣只需要sp_attach_db,把數(shù)據(jù)文件附加到新的數(shù)據(jù)庫上即可,或者在停機的時候把所有數(shù)據(jù)文件(一定要有master等)都copy到原有路徑下也行,不過一般不推薦這樣的做法,sp_attach_db比較好,雖然麻煩許多。
但是呢,一般SQL Server 崩潰的時候系統(tǒng)是未必能有時間把未完成的事務(wù)和臟頁等寫入磁盤的,這樣的情況sp_attach_db就會失敗。那么,寄期望于DBA制定了一個良好的災(zāi)難恢復(fù)計劃吧。按照你的恢復(fù)計劃,還原***的完全備份,增量備份或者事務(wù)日志備份,然后如果你的活動事務(wù)日志還能讀得出來的話,這樣的話你可以還原到崩潰前的狀態(tài)。
一般的單位都是沒有專職的DBA的,如果沒有可用的備份,更可能是最近一次備份的時間過于久遠而導(dǎo)致不可接受的數(shù)據(jù)損失,而且你的活動事務(wù)日志也處于不可用的狀態(tài),那就是最麻煩的情況了。
不幸的是,一般SQL Server 崩潰都是由于存儲子系統(tǒng)引起的,而這樣的情況是幾乎不可能有可用的日志用于恢復(fù)的。
首先,你可以試一下sp_attach_single_file_db,試著恢復(fù)一下你的數(shù)據(jù)文件,雖然能恢復(fù)的可能性不大,不過假如這個數(shù)據(jù)庫剛好執(zhí)行了一個checkpoint的話,還是有可能成功的。
我們可以試著重新建立一個Log,先把數(shù)據(jù)庫設(shè)置為emergency mode,sysdatabases的status為32768 就表示數(shù)據(jù)庫處于此狀態(tài)。
不過系統(tǒng)表是不能隨便改的,設(shè)置一下先Use MasterGosp_configure 'allow updates', 1reconfigure with overrideGo然后 update sysdatabases set status = 32768 where name = '' 現(xiàn)在,祈求滿天神佛的保佑吧,重新建立一個log文件。成功的機會還是相當(dāng)大的,系統(tǒng)一般都會認可你新建立的日志。如果沒有報告什么錯誤,現(xiàn)在就可以松一口氣了。
雖然數(shù)據(jù)是恢復(fù)了,可是別以為事情就算完成了,正在進行的事務(wù)肯定是丟失了,原來的數(shù)據(jù)也可能受到一些損壞:
先把SQL Server 重新啟動一下,然后檢查你的數(shù)據(jù)庫吧;
先設(shè)置成單用戶模式,然后做
- dbcc sp_dboption '', 'single user', 'true'DBCC CHECKDB('');
如果沒有什么大問題就可以把數(shù)據(jù)庫狀態(tài)改回去了,記得別忘了把系統(tǒng)表的修改選項關(guān)掉。update sysdatabases set status = 28 where name = '' ,當(dāng)然你的數(shù)據(jù)庫狀態(tài)可能不是這個,自己改為合適的值吧。也可以用:
- sp_resetstatusgosp_configure 'allow updates', 0reconfigure with overrideGo
checkdb的時候可能報告有一些錯誤,這些錯誤的數(shù)據(jù)你可能就只好丟棄了;checkdb有幾種修復(fù)選項,自己看著用吧,不過***你可能還是得REPAIR_ALLOW_DATA_LOSS,完成所有修復(fù);chekcdb并不能完成所有的修復(fù),我們需要更進一步的修復(fù),用DBCC CHECKTABLE對每一個表做檢查吧。
表的列表可以用sysobjects里面得到,把OBJECTPROPERTY是IsTable的全部找出來檢查一下吧,這樣能夠基本上解決問題了,如果還報告錯誤,試著把數(shù)據(jù)select into到另一張表檢查一下。
這些都做完了之后,把所有索引、視圖、存儲過程、觸發(fā)器等重新建立一下??梢詮腄BCC DBREINDEX得到幫助。上述的相關(guān)內(nèi)容就是對SQL Server 崩潰的恢復(fù)之法的描述,希望會給你帶來一些幫助在此方面。
【編輯推薦】
- 升級SQL Server系統(tǒng)的簡潔方案
- 實現(xiàn)SQL Server動態(tài)游標(biāo)的創(chuàng)建步驟
- 如何實現(xiàn)SQL Server臨時表的創(chuàng)建?
- SQL Server數(shù)據(jù)庫如何正確加密?
- SQL Server2005數(shù)據(jù)庫連接中易出現(xiàn)的錯誤列舉