向書本學(xué)習(xí),還要向?qū)嵺`學(xué)習(xí)、向生活學(xué)習(xí)。消化已有知識,
而且要力求有所發(fā)現(xiàn)、有所發(fā)明、有所創(chuàng)造
2019/3/26 12:38:44
任何數(shù)據(jù)庫系統(tǒng)都無法避免崩潰的狀況,即使你使用了Clustered,雙機熱備……仍然無法完全根除系統(tǒng)中的單點故障,何況對于大部分用戶來說,無法承受這樣昂貴的硬件投資。所以,在系統(tǒng)崩潰的時候,如何恢復(fù)原有的寶貴數(shù)據(jù)就成為一個極其重要的問題了。
通過我們多年的主機管理經(jīng)驗,總結(jié)了幾種方法緊急恢復(fù)您的數(shù)據(jù)庫,以下方法使用與萬網(wǎng)的獨立服務(wù)器用戶,請參考:
1、 最理想的情況就是您的數(shù)據(jù)文件(*.mdf)和日志文件(*.ldf)都完好無損,這樣只需要sp_attach_db,把數(shù)據(jù)文件附加到新的數(shù)據(jù)庫上即可,或者在停機的時候把所有數(shù)據(jù)文件(一定要有master等)都copy到原有路徑下也行,不過一般不推薦這樣的做法,sp_attach_db比較好,雖然比較繁瑣,容易出錯;
2、一般數(shù)據(jù)庫崩潰的時候系統(tǒng)是未必能有時間把未完成的事務(wù)和臟(壞)頁等寫入磁盤的,這樣的情況sp_attach_db(上述方法)就會失敗,這種情況就產(chǎn)生了第二中方法,制定了一個良好的備份計劃任務(wù)。按照你的計劃生成備份文件,還原最新的完全備份,增量備份或者事務(wù)日志備份,然后如果你的活動事務(wù)日志還能讀得出來的話,你可以還原到崩潰前的狀態(tài);這種方法的備份腳本及操作方法如下:打開企業(yè)管理器--管理--sql代理--作業(yè),使用以下腳本建立一個計劃:
declare @filename nvarchar(100) set @filename='F:\www\flooddatabasebak\stopq'+convert(char(10),getdate(),112) print @filename BACKUP DATABASE [db_name] TO DISK = @filename WITH NOINIT , NOUNLOAD , NAME = N' 備份', NOSKIP , STATS = 10, NOFORMAT;
3、如果上述兩種情況你都沒有,我們可以試著重新建立一個log,先把數(shù)據(jù)庫設(shè)置為emergency mode,sysdatabases的status為32768 就表示數(shù)據(jù)庫處于此狀態(tài)。
不過系統(tǒng)表是不能隨便改的,設(shè)置一下先使用以下腳本:
Use Master
Go
sp_configure 'allow updates', 1
reconfigure with override
Go
然后
update sysdatabases set status = 32768 where name = '<db_name>'
這種情況成功的機會還是相當(dāng)大的,系統(tǒng)一般都會認可你新建立的日志??梢詳?shù)據(jù)恢復(fù)了,但是這種操作正在進行的事務(wù)肯定是丟失了,原來的數(shù)據(jù)也可能受到一些損壞。
先把SQL Server 重新啟動一下,然后檢查你的數(shù)據(jù)庫。
先設(shè)置成單用戶模式,然后做dbcc
sp_dboption '<db_name>', 'single user', 'true'
DBCC CHECKDB('<db_name>')
如果沒有明顯的報錯可以把數(shù)據(jù)庫狀態(tài)改回去了,記得把系統(tǒng)表的修改選項關(guān)掉。
update sysdatabases set status = 28 where name = '<db_name>' --當(dāng)然你的數(shù)據(jù)庫狀態(tài)可能不是這個,自己改為合適的值。也可以用sp_resetstatus
go
sp_configure 'allow updates', 0
reconfigure with override
Go
checkdb的時候可能報告有一些錯誤,這些錯誤的數(shù)據(jù)你可能就只好丟棄了。
checkdb有幾種修復(fù)選項,根據(jù)自己的情況選擇,不過最后你還是得用REPAIR_ALLOW_DATA_LOSS,完成所有修復(fù)。
chekcdb并不能完成所有的修復(fù),我們需要更進一步的修復(fù),用DBCC CHECKTABLE對每一個表做檢查。
表的列表可以用sysobjects里面得到,把OBJECTPROPERTY是IsTable的全部找出來檢查一下,這樣能夠基本上解決問題了,如果還報告錯誤,試著把數(shù)據(jù)select into到另一張表檢查一下。
這些都做完了之后,把所有索引、視圖、存儲過程、觸發(fā)器等重新建立一下。DBCC DBREINDEX可以有效完成。
就可以繼續(xù)使用你的數(shù)據(jù)庫了,這時候你最好是根據(jù)第二種方法做好備份。
深圳市南山區(qū)南山街道南海大道西桂廟路北陽光華藝大廈1棟4F、4G-04
咨詢電話:136 8237 6272
大客戶咨詢:139 0290 5075
業(yè)務(wù)QQ:195006118
技術(shù)QQ:179981967