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