溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

MySQL中Double Write Buffer的分析是怎樣的

發(fā)布時間:2021-11-16 16:20:28 來源:億速云 閱讀:296 作者:柒染 欄目:MySQL數(shù)據(jù)庫

這篇文章將為大家詳細(xì)講解有關(guān)MySQL中Double Write Buffer的分析是怎樣的,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

Double Write Buffer是什么?
這是一個buffer,存在于內(nèi)存中,在持久化到磁盤的時候,這一部分?jǐn)?shù)據(jù)會寫進(jìn)innodb的表空間里,由一段連續(xù)的pages組成;
Double Write這個特性,和命名所描述的完全一致:寫兩遍~

為什么要引入Double Write Buffer?
引入Double Write Buffer是為了解決partial page write的問題,關(guān)于這個問題的描述,引用楊大師的原文,
>>>
InnoDB 的Page Size一般是16KB,其數(shù)據(jù)校驗也是針對這16KB來計算的,將數(shù)據(jù)寫入到磁盤是以Page為單位進(jìn)行操作的。
而計算機(jī)硬件和操作系統(tǒng),在極端情況下(比如斷電)往往并不能保證這一操作的原子性,
16K的數(shù)據(jù),寫入4K 時,發(fā)生了系統(tǒng)斷電/os crash ,只有一部分寫是成功的,這種情況下就是 partial page write 問題。
<<<

追問1:拋開page不完全寫入的這個概念,DB在做crash recovery的時候,不是可以從redo log來重新做一遍么,為什么還要這個特性呢?
解答:原因有兩個,
1.由于Page的不完全寫入,實際上這個出問題的Page由于沒有完全寫入所以這個page的checksum是無效的,想恢復(fù)這個page的時候,無法定位是哪個page寫出了問題;
2.redo-log的原因, MySQL的innodb在生成redo-log的時候,并沒有寫入具體數(shù)據(jù)的變更,而是只記錄了這個變更所在的page信息,具體的格式如下
    [Space-id] [Page-id] [Where-in-the-page-to-modify] [Payload]
其中,space-id記錄的是這個信息存儲于哪個redo-log文件,page-id記錄的就是page的id(..._(:з」∠)_...),其余信息基本如描述所示;
由于redo-log的這種記錄方式,使得MySQL不能依靠redo-log去把崩潰前后一段時間的整個事務(wù)全部找出來,然后重做;(存都沒存數(shù)據(jù),怎么恢復(fù)╮(╯▽╰)╭;

Double Write Buffer工作在哪個階段/時機(jī)?
當(dāng)innodb從buffer pool中刷新pages到磁盤時,并不是直接往磁盤寫,而是先寫進(jìn)這個Double Write Buffer,
然后馬上調(diào)用fsync(),將這一部分?jǐn)?shù)據(jù)寫到磁盤上,之后再把這部分的pages寫到真正的數(shù)據(jù)文件里面去;

Double Write Buffer能不能解決問題?
答案肯定是可以~
情景1:innodb從buffer pool往Double Write Buffer寫pages的時候,出事故了,發(fā)生了page的部分寫入;
分析:innodb在crash recovery的時候,檢查到數(shù)據(jù)文件的pages都是正常的,通過比較LSN/checksum能夠檢查到數(shù)據(jù)文件的具體狀態(tài),然后再去恢復(fù)數(shù)據(jù);
情景2:Double Write Buffer往真正的數(shù)據(jù)文件寫pages的時候,出事故了,發(fā)生了page的部分寫入;
分析:由于Double Write Buffer本身有這個pages的完整內(nèi)容,從Double Write Buffer重新往數(shù)據(jù)文件寫pages即可;

Double Write Buffer對性能的影響?
由于Double Write Buffer本身是一段完全連續(xù)的空間,所以Double Write Buffer從內(nèi)存寫到磁盤的時候是完完全全的順序?qū)?/strong>,
所以對性能的影響并沒有從1個fsync()到2個fsync()這么夸張,引用percona的工程師的判斷:性能影響不超過5%-10%;

關(guān)于MySQL中Double Write Buffer的分析是怎樣的就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI