MySQLInnoDB特性:兩次寫(DoubleWrite)

Partial page write

InnoDB將數(shù)據(jù)寫入到磁盤是以Page為單位進(jìn)行操作的。Page Size一般是16KB,其數(shù)據(jù)校驗也是針對這16KB來計算的。由于文件系統(tǒng)對一次大數(shù)據(jù)頁大多數(shù)情況下不是原子操作,這意味著如果服務(wù)器宕機(jī)了,可能只做了部分寫入。16K的數(shù)據(jù),寫入4K時,發(fā)生了系統(tǒng)斷電/os crash ,只有一部分寫是成功的,這種情況下就是partial page write問題。

如果發(fā)生寫失效,MySQL可以根據(jù)redo log進(jìn)行恢復(fù)。這是一個辦法,但是必須清楚地認(rèn)識到,redo log中記錄的是對頁的物理修改,如偏移量800,寫’aaaa’記錄。如果這個頁本身已經(jīng)發(fā)生了損壞,再對其進(jìn)行重做是沒有意義的。

MySQL在恢復(fù)的過程中檢查page的checksum,checksum就是檢查page的最后事務(wù)號,發(fā)生partial page write問題時,page已經(jīng)損壞,找不到該page中的事務(wù)號。在InnoDB看來,這樣的數(shù)據(jù)頁是無法通過checksum驗證的,就無法恢復(fù)。即時我們強(qiáng)制讓其通過驗證,也無法從崩潰中恢復(fù),因為當(dāng)前InnoDB存在的一些日志類型,有些是邏輯操作,并不能做到冪等。

Double write buffer

為了解決這個問題,InnoDB實現(xiàn)了double write buffer,簡單來說,就是在寫數(shù)據(jù)頁之前,先把這個數(shù)據(jù)頁寫到一塊獨(dú)立的物理文件位置(ibdata),然后再寫到數(shù)據(jù)頁。這樣在宕機(jī)重啟時,如果出現(xiàn)數(shù)據(jù)頁損壞,那么在應(yīng)用redo log之前,需要通過該頁的副本來還原該頁,然后再進(jìn)行redo log重做,這就是double write。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容