掃描二維碼關注

首頁 APP開(kāi)發小(xiǎo)程序開(kāi)發 微信公衆号 網站建設 營銷推廣 經典案列 産品服務 關于我們

“學習(xí)不僅是掌握知識”

向書(shū)本學習(xí),還要向實踐學習(xí)、向生活學習(xí)。消化已有(yǒu)知識,
而且要力求有(yǒu)所發現、有(yǒu)所發明(míng)、有(yǒu)所創造

當SQL Server數據庫崩潰時如(rú)何恢複?

2019/3/26 12:38:44

當SQL Server數據庫崩潰時如(rú)何恢複?

任何數據庫系統都(dōu)無法避免崩潰的(de)狀況,即使你(nǐ)使用(yòng)了Clustered,雙機熱(rè)備……仍然無法完全根除系統中的(de)單點故障,何況對于大(dà)部分(fēn)用(yòng)戶來說,無法承受這樣昂貴的(de)硬件(jiàn)投資。所以,在系統崩潰的(de)時候,如(rú)何恢複原有(yǒu)的(de)寶貴數據就成爲一個(gè)極其重要的(de)問題了。
    通過我們多年的(de)主機管理(lǐ)經驗,總結了幾種方法緊急恢複您的(de)數據庫,以下方法使用(yòng)與萬網的(de)獨立服務器(qì)用(yòng)戶,請參考:
1、 最理(lǐ)想的(de)情況就是您的(de)數據文(wén)件(jiàn)(*.mdf)和(hé)日志文(wén)件(jiàn)(*.ldf)都(dōu)完好無損,這樣隻需要sp_attach_db,把數據文(wén)件(jiàn)附加到(dào)新的(de)數據庫上(shàng)即可(kě),或者在停機的(de)時候把所有(yǒu)數據文(wén)件(jiàn)(一定要有(yǒu)master等)都(dōu)copy到(dào)原有(yǒu)路(lù)徑下也(yě)行(xíng),不過一般不推薦這樣的(de)做法,sp_attach_db比較好,雖然比較繁瑣,容易出錯;
2、一般數據庫崩潰的(de)時候系統是未必能(néng)有(yǒu)時間把未完成的(de)事務和(hé)髒(壞)頁等寫入磁盤的(de),這樣的(de)情況sp_attach_db(上(shàng)述方法)就會(huì)失敗,這種情況就産生了第二中方法,制(zhì)定了一個(gè)良好的(de)備份計(jì)劃任務。按照(zhào)你(nǐ)的(de)計(jì)劃生成備份文(wén)件(jiàn),還原最新的(de)完全備份,增量備份或者事務日志備份,然後如(rú)果你(nǐ)的(de)活動事務日志還能(néng)讀(dú)得出來的(de)話(huà),你(nǐ)可(kě)以還原到(dào)崩潰前的(de)狀态;這種方法的(de)備份腳本及操作方法如(rú)下:打開(kāi)企業(yè)管理(lǐ)器(qì)--管理(lǐ)--sql代理(lǐ)--作業(yè),使用(yòng)以下腳本建立一個(gè)計(jì)劃:
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、如(rú)果上(shàng)述兩種情況你(nǐ)都(dōu)沒有(yǒu),我們可(kě)以試著(zhe)重新建立一個(gè)log,先把數據庫設置爲emergency mode,sysdatabases的(de)status爲32768 就表示數據庫處于此狀态。
不過系統表是不能(néng)随便改的(de),設置一下先使用(yòng)以下腳本:
Use Master
Go
sp_configure 'allow updates', 1
reconfigure with override
Go
然後
update sysdatabases set status = 32768 where name = '<db_name>'
這種情況成功的(de)機會(huì)還是相(xiàng)當大(dà)的(de),系統一般都(dōu)會(huì)認可(kě)你(nǐ)新建立的(de)日志。可(kě)以數據恢複了,但(dàn)是這種操作正在進行(xíng)的(de)事務肯定是丢失了,原來的(de)數據也(yě)可(kě)能(néng)受到(dào)一些損壞。
先把SQL Server 重新啓動一下,然後檢查你(nǐ)的(de)數據庫。
先設置成單用(yòng)戶模式,然後做dbcc
sp_dboption '<db_name>', 'single user', 'true'
DBCC CHECKDB('<db_name>')
如(rú)果沒有(yǒu)明(míng)顯的(de)報錯可(kě)以把數據庫狀态改回去了,記得把系統表的(de)修改選項關掉。
update sysdatabases set status = 28 where name = '<db_name>' --當然你(nǐ)的(de)數據庫狀态可(kě)能(néng)不是這個(gè),自己改爲合适的(de)值。也(yě)可(kě)以用(yòng)sp_resetstatus
go
sp_configure 'allow updates', 0
reconfigure with override
Go

checkdb的(de)時候可(kě)能(néng)報告有(yǒu)一些錯誤,這些錯誤的(de)數據你(nǐ)可(kě)能(néng)就隻好丢棄了。
checkdb有(yǒu)幾種修複選項,根據自己的(de)情況選擇,不過最後你(nǐ)還是得用(yòng)REPAIR_ALLOW_DATA_LOSS,完成所有(yǒu)修複。
chekcdb并不能(néng)完成所有(yǒu)的(de)修複,我們需要更進一步的(de)修複,用(yòng)DBCC CHECKTABLE對每一個(gè)表做檢查。
表的(de)列表可(kě)以用(yòng)sysobjects裏面得到(dào),把OBJECTPROPERTY是IsTable的(de)全部找出來檢查一下,這樣能(néng)夠基本上(shàng)解決問題了,如(rú)果還報告錯誤,試著(zhe)把數據select into到(dào)另一張表檢查一下。
這些都(dōu)做完了之後,把所有(yǒu)索引、視圖、存儲過程、觸發器(qì)等重新建立一下。DBCC DBREINDEX可(kě)以有(yǒu)效完成。

就可(kě)以繼續使用(yòng)你(nǐ)的(de)數據庫了,這時候你(nǐ)最好是根據第二種方法做好備份。


深圳市南山區南山街(jiē)道南海(hǎi)大(dà)道西(xī)桂廟路(lù)北陽光(guāng)華藝大(dà)廈1棟4F、4G-04

咨詢電話(huà):136 8237 6272
大(dà)客戶咨詢:139 0290 5075
業(yè)務QQ:195006118
技術(shù)QQ:179981967

更多可(kě)以了解的(de)信息

客戶案列
新聞資訊
資質榮譽
團隊風采
項目進度查詢

售前QQ咨詢
QQ溝通 項目QQ溝通

精銳軟件(jiàn)

Copyright© 2018-2023 深圳市無窮大軟件技術有限公司 All Rights Reserved. 京ICP證000000号 公安備案号:粵公網安備44030502009460号