這篇文章將為大家詳細(xì)講解有關(guān)MySQL中Double Write Buffer的分析是怎樣的,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對相關(guān)知識(shí)有一定的了解。
創(chuàng)新互聯(lián)是一家專注于成都做網(wǎng)站、網(wǎng)站制作與策劃設(shè)計(jì),新北網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:新北等地區(qū)。新北做網(wǎng)站價(jià)格咨詢:18980820575
Double Write Buffer是什么?
這是一個(gè)buffer,存在于內(nèi)存中,在持久化到磁盤的時(shí)候,這一部分?jǐn)?shù)據(jù)會(huì)寫進(jìn)innodb的表空間里,由一段連續(xù)的pages組成;
Double Write這個(gè)特性,和命名所描述的完全一致:寫兩遍~
為什么要引入Double Write Buffer?
引入Double Write Buffer是為了解決partial page write的問題,關(guān)于這個(gè)問題的描述,引用楊大師的原文,
>>>
InnoDB 的Page Size一般是16KB,其數(shù)據(jù)校驗(yàn)也是針對這16KB來計(jì)算的,將數(shù)據(jù)寫入到磁盤是以Page為單位進(jìn)行操作的。
而計(jì)算機(jī)硬件和操作系統(tǒng),在極端情況下(比如斷電)往往并不能保證這一操作的原子性,
16K的數(shù)據(jù),寫入4K 時(shí),發(fā)生了系統(tǒng)斷電/os crash ,只有一部分寫是成功的,這種情況下就是 partial page write 問題。
<<<
追問1:拋開page不完全寫入的這個(gè)概念,DB在做crash recovery的時(shí)候,不是可以從redo log來重新做一遍么,為什么還要這個(gè)特性呢?
解答:原因有兩個(gè),
1.由于Page的不完全寫入,實(shí)際上這個(gè)出問題的Page由于沒有完全寫入,所以這個(gè)page的checksum是無效的,想恢復(fù)這個(gè)page的時(shí)候,無法定位是哪個(gè)page寫出了問題;
2.redo-log的原因, MySQL的innodb在生成redo-log的時(shí)候,并沒有寫入具體數(shù)據(jù)的變更,而是只記錄了這個(gè)變更所在的page信息,具體的格式如下
[Space-id] [Page-id] [Where-in-the-page-to-modify] [Payload]
其中,space-id記錄的是這個(gè)信息存儲(chǔ)于哪個(gè)redo-log文件,page-id記錄的就是page的id(..._(:з」∠)_...),其余信息基本如描述所示;
由于redo-log的這種記錄方式,使得MySQL不能依靠redo-log去把崩潰前后一段時(shí)間的整個(gè)事務(wù)全部找出來,然后重做;(存都沒存數(shù)據(jù),怎么恢復(fù)嘛╮(╯▽╰)╭);
Double Write Buffer工作在哪個(gè)階段/時(shí)機(jī)?
當(dāng)innodb從buffer pool中刷新pages到磁盤時(shí),并不是直接往磁盤寫,而是先寫進(jìn)這個(gè)Double Write Buffer,
然后馬上調(diào)用fsync(),將這一部分?jǐn)?shù)據(jù)寫到磁盤上,之后再把這部分的pages寫到真正的數(shù)據(jù)文件里面去;
Double Write Buffer能不能解決問題?
答案肯定是可以~
情景1:innodb從buffer pool往Double Write Buffer寫pages的時(shí)候,出事故了,發(fā)生了page的部分寫入;
分析:innodb在crash recovery的時(shí)候,檢查到數(shù)據(jù)文件的pages都是正常的,通過比較LSN/checksum能夠檢查到數(shù)據(jù)文件的具體狀態(tài),然后再去恢復(fù)數(shù)據(jù);
情景2:從Double Write Buffer往真正的數(shù)據(jù)文件寫pages的時(shí)候,出事故了,發(fā)生了page的部分寫入;
分析:由于Double Write Buffer本身有這個(gè)pages的完整內(nèi)容,從Double Write Buffer重新往數(shù)據(jù)文件寫pages即可;
Double Write Buffer對性能的影響?
由于Double Write Buffer本身是一段完全連續(xù)的空間,所以Double Write Buffer從內(nèi)存寫到磁盤的時(shí)候是完完全全的順序?qū)?/strong>,
所以對性能的影響并沒有從1個(gè)fsync()到2個(gè)fsync()這么夸張,引用percona的工程師的判斷:性能影響不超過5%-10%;
關(guān)于MySQL中Double Write Buffer的分析是怎樣的就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。