香港服務(wù)器在我們知道可能造成數(shù)據(jù)庫的損壞原因之后,接下來我們來看SQL Server是如何監(jiān)測數(shù)據(jù)庫頁損壞的。
在SQL Server的數(shù)據(jù)庫級別,可以設(shè)置頁保護(hù)類型,一共有三個(gè)選項(xiàng):None,CheckSum,Torn_Page_Detection,如圖1所示:
關(guān)于這三種選項(xiàng),首先,請無視None,請不要在任何場景下選擇該選項(xiàng),該選項(xiàng)意味著SQL Server不對頁進(jìn)行保護(hù)。
其次是TORN_PAGE_DETECTION,在SQL Server中,數(shù)據(jù)的最小單位是頁,每一頁是8K,但是對應(yīng)磁盤上往往是16個(gè)512字節(jié)的扇區(qū),如果一個(gè)頁在寫入持久化存儲(chǔ)的過程中,
只寫了一半的頁,這就是所謂的TORN_PAGE_DETECTION,SQL Server通過每個(gè)扇區(qū)提512?節(jié)中前2位作為元數(shù)據(jù),總共16個(gè)扇區(qū)32位4字節(jié)的元數(shù)據(jù)(頁頭中標(biāo)識(shí)為:m_tornBits),
通過該元數(shù)據(jù)來檢測是否存在部分寫的TORN_PAGE,但該類型的頁驗(yàn)證無法檢測出頁中的寫入錯(cuò)誤,因此在SQL Server 2005及以上版本,盡量選擇CheckSum。
在SQL Server 2005及以上版本,引入了CheckSum,CheckSum可以理解為校驗(yàn)和,當(dāng)數(shù)據(jù)頁被寫入持久化存儲(chǔ)時(shí),會(huì)根據(jù)頁的值計(jì)算出一個(gè)4字節(jié)的CheckSum存于頁頭(頁頭中標(biāo)識(shí)同為:m_tornBits),
和數(shù)據(jù)在同一頁中一起保存在數(shù)據(jù)庫中。當(dāng)數(shù)據(jù)從IO子系統(tǒng)被讀取到內(nèi)存中時(shí),SQL Server會(huì)根據(jù)頁內(nèi)的值再次計(jì)算CheckSum,用該重新計(jì)算的