在一個(gè)理想的世界中,不會(huì)存在任何數(shù)據(jù)庫(kù)的損壞,就像我們不會(huì)將一些嚴(yán)重意外情況列入我們生活中的日常一樣,而一旦這類事情發(fā)生,一定會(huì)對(duì)我們的生活造成非常顯著的影響,在SQL Server中也同樣如此,或許幾年內(nèi)您沒有遇見過數(shù)據(jù)庫(kù)中出現(xiàn)這類情況,而一旦遇見這類情況,往往伴隨著數(shù)據(jù)的丟失,宕機(jī),嚴(yán)重甚至您本身的職業(yè)生涯也會(huì)受到影響。因此對(duì)于這類情況,我們需要了解數(shù)據(jù)庫(kù)損壞方面的知識(shí),以便我們能夠事前準(zhǔn)備,事后能夠處理。本篇文章會(huì)對(duì)數(shù)據(jù)庫(kù)損壞的原因、現(xiàn)象、事前和事后的一些處理方法以及簡(jiǎn)單的修復(fù)方法進(jìn)行探討。
數(shù)據(jù)庫(kù)為什么會(huì)損壞?
在了解數(shù)據(jù)庫(kù)損壞之前,首先我們要了解SQL Server是如何將數(shù)據(jù)保存到數(shù)據(jù)文件(MDF、NDF等)。無論更新還是插入數(shù)據(jù),數(shù)據(jù)都需要首先在內(nèi)存中的Buffer Pool駐留,然后通過CheckPoint和Lazy Writer等過程將內(nèi)存中的數(shù)據(jù)持久化到磁盤。在這個(gè)過程中,數(shù)據(jù)臟頁由內(nèi)存寫入持久化的IO子系統(tǒng),在此期間,按照IO子系統(tǒng)的不同,數(shù)據(jù)可能經(jīng)過這幾層:
Windows(寫數(shù)據(jù)一定調(diào)用的是WINDOWS API)
Windows底層的中間層(殺毒軟件,磁盤加密系統(tǒng))
網(wǎng)卡、路由器、交換機(jī)、光釬、網(wǎng)線等(如果IO子系統(tǒng)不是直連的話)
SAN控制器(如果使用了SAN)
RAID控制器(IO子系統(tǒng)做了RAID)
磁盤或SSD等持久化存儲(chǔ)器
因此,數(shù)據(jù)頁被寫入持久化存儲(chǔ)期間,可能經(jīng)過上述列表中的幾項(xiàng)。在經(jīng)歷上述過程中,硬件環(huán)境會(huì)受到很多方面的影響,比如說電壓是否穩(wěn)定、斷電、溫度過高或過低、潮濕程度等,而軟件方面,由于軟件都是人寫的,因此就可能存在BUG,這些都可能導(dǎo)致數(shù)據(jù)頁在傳輸過程中出現(xiàn)錯(cuò)誤。
此外,影響磁盤的因素也包括電壓是否穩(wěn)定、灰塵等因素,這些也有可能引起磁盤壞道或整體損壞。
上面提到的所有因素都可以被歸結(jié)為IO子系統(tǒng)。因此,造成數(shù)據(jù)損壞的情況絕大部分是由IO子系統(tǒng)引起的,還有非常非常小的概率內(nèi)存芯片也會(huì)導(dǎo)致數(shù)據(jù)頁損壞,但這部分情況微乎其微,因此不在本文的討論之列。
上面提到的這些導(dǎo)致數(shù)據(jù)損壞的原因都屬于天災(zāi),還有一些人禍。比如說通過編輯器等手動(dòng)編輯數(shù)據(jù)文件、數(shù)據(jù)庫(kù)中還有需要Redo和Undo的事務(wù)時(shí)(也就是沒有Clean Shutdown)刪除了日志文件(通常會(huì)導(dǎo)致數(shù)據(jù)庫(kù)質(zhì)疑)。
發(fā)現(xiàn)數(shù)據(jù)庫(kù)損壞
在我們知道可能造成數(shù)據(jù)庫(kù)的損壞原因之后,接下來我們來看SQL Server是如何監(jiān)測(cè)數(shù)據(jù)庫(kù)頁損壞的。
在SQL Server的數(shù)據(jù)庫(kù)級(jí)別,可以設(shè)置頁保護(hù)類型,一共有三個(gè)選項(xiàng):None,CheckSum,Torn_Page_Detection,如圖1所示:
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注