在MySQL的InnoDB存儲(chǔ)引擎中的Doublewrite Buffer詳解
一、Doublewrite Buffer(雙寫緩沖)是什么
在 MySQL 的 InnoDB 存儲(chǔ)引擎中,Doublewrite Buffer 是一塊特殊的內(nèi)存區(qū)域(也會(huì)涉及磁盤上的物理存儲(chǔ) ),其大小可通過(guò) innodb_doublewrite 等相關(guān)參數(shù)配置(默認(rèn)開啟 )。
從物理結(jié)構(gòu)看,它在磁盤上對(duì)應(yīng) InnoDB 表空間中連續(xù)的 128 個(gè)頁(yè)(每個(gè)頁(yè) 16KB ,共 2MB 大小 ),主要用于在 InnoDB 進(jìn)行頁(yè)寫入操作時(shí),承擔(dān)中間緩沖和保護(hù)的角色 。
二、存在的背景:部分寫失?。≒artial Page Writes)問(wèn)題
InnoDB 的數(shù)據(jù)是以頁(yè)(Page ,默認(rèn) 16KB )為單位存儲(chǔ)在磁盤上的。當(dāng)數(shù)據(jù)庫(kù)要把內(nèi)存中修改后的頁(yè)(臟頁(yè) )刷新到磁盤時(shí),可能會(huì)遇到 “部分寫失敗” 的情況。比如,正在向磁盤寫入一個(gè) 16KB 的頁(yè),此時(shí)突然發(fā)生斷電、磁盤故障等意外,導(dǎo)致只寫入了部分?jǐn)?shù)據(jù)(比如 8KB ),那么這個(gè)頁(yè)就會(huì)變成 “半寫頁(yè)” ,頁(yè)的結(jié)構(gòu)被破壞 。
因?yàn)?InnoDB 頁(yè)有特定的格式和校驗(yàn)機(jī)制,包含頁(yè)頭、頁(yè)尾的校驗(yàn)信息、數(shù)據(jù)區(qū)等。一旦出現(xiàn)部分寫失敗,后續(xù)數(shù)據(jù)庫(kù)啟動(dòng)或訪問(wèn)該頁(yè)時(shí),會(huì)發(fā)現(xiàn)頁(yè)的校驗(yàn)不通過(guò),無(wú)法正常識(shí)別和使用,進(jìn)而可能導(dǎo)致數(shù)據(jù)丟失、損壞,影響數(shù)據(jù)庫(kù)的一致性和可用性 。
三、Doublewrite Buffer 的作用:解決部分寫失敗,保障數(shù)據(jù)完整性
雙寫流程
- 第一步:寫雙寫緩沖:當(dāng) InnoDB 要將臟頁(yè)刷新到磁盤時(shí),不會(huì)直接寫入最終的磁盤位置,而是先把該臟頁(yè)的完整數(shù)據(jù)寫入到 Doublewrite Buffer 對(duì)應(yīng)的磁盤區(qū)域(這部分寫入是連續(xù)的、順序的寫操作 )因?yàn)?Doublewrite Buffer 在磁盤上是連續(xù)的 2MB 空間,順序?qū)懙男阅芟鄬?duì)較高 。
- 第二步:寫實(shí)際數(shù)據(jù)頁(yè):在成功將臟頁(yè)數(shù)據(jù)寫入 Doublewrite Buffer 后,再將這些數(shù)據(jù)寫入到磁盤上真正的表空間位置(即該頁(yè)原本應(yīng)該存儲(chǔ)的位置 )。
應(yīng)對(duì)部分寫失敗的恢復(fù)機(jī)制
- 如果在第二步寫實(shí)際數(shù)據(jù)頁(yè)的過(guò)程中,發(fā)生了部分寫失?。ㄈ鐢嚯姷?),當(dāng)數(shù)據(jù)庫(kù)后續(xù)重啟或進(jìn)行崩潰恢復(fù)時(shí),InnoDB 會(huì)先檢查磁盤上實(shí)際數(shù)據(jù)頁(yè)的完整性。若發(fā)現(xiàn)該頁(yè)損壞(校驗(yàn)不通過(guò) ),就會(huì)從 Doublewrite Buffer 中讀取之前保存的完整頁(yè)數(shù)據(jù),覆蓋到損壞的頁(yè)上,然后再基于 redo log(重做日志 )進(jìn)行進(jìn)一步的恢復(fù)操作,保證頁(yè)的完整性和數(shù)據(jù)的一致性 。
- 簡(jiǎn)單來(lái)說(shuō),Doublewrite Buffer 相當(dāng)于給數(shù)據(jù)頁(yè)的寫入上了 “雙保險(xiǎn)” ,即便實(shí)際數(shù)據(jù)頁(yè)寫入失敗,也能依靠它找回完整的頁(yè)數(shù)據(jù),避免因部分寫失敗導(dǎo)致的數(shù)據(jù)損壞,是 InnoDB 保障數(shù)據(jù)持久化和一致性的重要手段之一 。
四、與其他組件的協(xié)同
Doublewrite Buffer 通常會(huì)和 redo log 配合工作 。redo log 記錄了數(shù)據(jù)頁(yè)的修改操作,用于崩潰時(shí)重做這些操作來(lái)恢復(fù)數(shù)據(jù);而 Doublewrite Buffer 解決的是頁(yè)本身寫入不完整的問(wèn)題。
在恢復(fù)流程中,先通過(guò) Doublewrite Buffer 修復(fù)損壞的頁(yè)結(jié)構(gòu),再利用 redo log 重新應(yīng)用頁(yè)內(nèi)的修改操作,二者共同保障了 InnoDB 存儲(chǔ)引擎在面對(duì)各種故障時(shí)的數(shù)據(jù)可靠性 。
綜上所述,Doublewrite Buffer 是 InnoDB 為應(yīng)對(duì)磁盤寫入可能出現(xiàn)的部分寫失敗問(wèn)題而設(shè)計(jì)的關(guān)鍵組件,通過(guò)雙寫的機(jī)制,有效防止數(shù)據(jù)頁(yè)損壞,保障數(shù)據(jù)庫(kù)的數(shù)據(jù)完整性和可靠性 。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Windows下通過(guò)MySQL Installer安裝MySQL服務(wù)的教程圖解
MYSQL官方提供了Installer方式安裝MYSQL服務(wù)以及其他組件,使的Windows下安裝,卸載,配置MYSQL變得特別簡(jiǎn)單。接下來(lái)通過(guò)圖文并茂的形式給大家介紹Windows下通過(guò)MySQL Installer安裝MySQL服務(wù)的教程,一起看看吧2018-10-10
mysql中ALTER AGGREGATE使用場(chǎng)景小結(jié)
ALTER AGGREGATE?是 SQL 中用于修改已定義聚合函數(shù)的語(yǔ)法,本文主要介紹了mysql中ALTER AGGREGATE使用場(chǎng)景小結(jié),具有一定的的參考價(jià)值,感興趣的可以了解一下2025-05-05
Jmeter如何向數(shù)據(jù)庫(kù)批量插入數(shù)據(jù)
這篇文章主要介紹了Jmeter如何向數(shù)據(jù)庫(kù)批量插入數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03

