最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL的雙寫緩沖區(qū)Doublewrite Buffer詳解

 更新時間:2023年07月12日 10:21:39   作者:碼農(nóng)BookSea  
這篇文章主要介紹了MySQL的雙寫緩沖區(qū)Doublewrite Buffer詳解,InnoDB是MySQL中一種常用的事務(wù)性存儲引擎,它具有很多優(yōu)秀的特性,其中,Doublewrite Buffer是InnoDB的一個重要特性之一,本文將介紹Doublewrite Buffer的原理和應(yīng)用,需要的朋友可以參考下

為什么需要Doublewrite Buffer

我們常見的服務(wù)器一般都是Linux操作系統(tǒng),Linux文件系統(tǒng)頁(OS Page)的大小默認(rèn)是4KB。而MySQL的頁(Page)大小默認(rèn)是16KB。

可以使用如下命令查看MySQL的Page大?。?/p>

SHOW VARIABLES LIKE 'innodb_page_size';

一般情況下,其余程序因為需要跟操作系統(tǒng)交互,它們的頁(Page)都會大于等于操作系統(tǒng)的頁大小,為整數(shù)倍。比如,Oracle的Page大小為8KB。

MySQL程序是跑在Linux操作系統(tǒng)上的,需要跟操作系統(tǒng)交互,所以MySQL中一頁數(shù)據(jù)刷到磁盤,要寫4個文件系統(tǒng)里的頁。

需要注意的是,這個操作并非原子操作,比如我操作系統(tǒng)寫到第二個頁的時候,Linux機(jī)器斷電了,這時候就會出現(xiàn)問題了。造成”頁數(shù)據(jù)損壞“。并且這種”頁數(shù)據(jù)損壞“靠 redo日志是無法修復(fù)的

重做日志中記錄的是對頁的物理操作,而不是頁面的全量記錄,而如果發(fā)生partial page write(部分頁寫入)問題時,出現(xiàn)問題的是未修改過的數(shù)據(jù),此時重做日志(Redo Log)無能為力。寫doublewrite buffer成功了,這個問題就不用擔(dān)心了

Doublewrite Buffer的出現(xiàn)就是為了解決上面的這種情況,雖然名字帶了Buffer,但實際上Doublewrite Buffer是內(nèi)存+磁盤的結(jié)構(gòu)。

Doublewrite Buffer是一種特殊文件flush技術(shù),帶給InnoDB存儲引擎的是數(shù)據(jù)頁的可靠性。它的作用是,在把頁寫到數(shù)據(jù)文件之前,InnoDB先把它們寫到一個叫doublewrite buffer(雙寫緩沖區(qū))的共享表空間內(nèi),在寫doublewrite buffer完成后,InnoDB才會把頁寫到數(shù)據(jù)文件的適當(dāng)?shù)奈恢?。如果在寫頁的過程中發(fā)生意外崩潰,InnoDB在稍后的恢復(fù)過程中在doublewrite buffer中找到完好的page副本用于恢復(fù)。

Doublewrite Buffer原理

如上圖所示,當(dāng)有頁數(shù)據(jù)要刷盤時:

  1. 頁數(shù)據(jù)先通過memcpy函數(shù)拷貝至內(nèi)存中的Doublewrite Buffer中;
  2. Doublewrite Buffer的內(nèi)存里的數(shù)據(jù)頁,會fsync刷到Doublewrite Buffer的磁盤上,分兩次寫入磁盤共享表空間中(連續(xù)存儲,順序?qū)?,性能很?,每次寫1MB;
  3. Doublewrite Buffer的內(nèi)存里的數(shù)據(jù)頁,再刷到數(shù)據(jù)磁盤存儲.ibd文件上(離散寫);

Doublewrite Buffer內(nèi)存結(jié)構(gòu)由128個頁(Page)構(gòu)成,大小是2MB。

Doublewrite Buffer磁盤結(jié)構(gòu)在系統(tǒng)表空間上是128個頁(2個區(qū),extend1和extend2),大小是2MB。

如果操作系統(tǒng)在將頁寫入磁盤的過程中發(fā)生了崩潰,在恢復(fù)過程中,InnoDB存儲引擎可以從共享表空間中的Double write中找到該頁的一個副本,將其復(fù)制到表空間文件,再應(yīng)用重做日志。

MySQL會檢查double writer的數(shù)據(jù)的完整性,如果不完整直接丟棄double write buffer內(nèi)容,重新執(zhí)行那條redo log,如果double write buffer的數(shù)據(jù)是完整的,用double writer buffer的數(shù)據(jù)更新該數(shù)據(jù)頁,跳過該redo log。

所以在正常的情況下,MySQL寫數(shù)據(jù)頁時,會寫兩遍到磁盤上,第一遍是寫到doublewrite buffer,第二遍是寫到真正的數(shù)據(jù)文件中,這就是“Doublewrite”的由來。

在數(shù)據(jù)庫異常關(guān)閉的情況下啟動時,都會做數(shù)據(jù)庫恢復(fù)(redo)操作,恢復(fù)的過程中,數(shù)據(jù)庫都會檢查頁面是不是合法(校驗等等),如果發(fā)現(xiàn)一個頁面校驗結(jié)果不一致,則此時會用到雙寫這個功能。

我們可以通過如下命令來監(jiān)控Doublewrite Buffer工作負(fù)載:

show global status like '%dblwr%';

Doublewrite Buffer相關(guān)參數(shù)

  • innodb_doublewrite:Doublewrite Buffer是否啟用開關(guān),默認(rèn)是開啟狀態(tài),InnoDB將所有數(shù)據(jù)存儲兩次,首先到雙寫緩沖區(qū),然后到實際數(shù)據(jù)文件。
  • Innodb_dblwr_pages_written:記錄寫入到DWB中的頁數(shù)量。
  • Innodb_dblwr_writes:記錄DWB寫操作的次數(shù)。

總結(jié)

InnoDB Doublewrite Buffer是InnoDB的一個重要特性,用于保證MySQL數(shù)據(jù)的可靠性和一致性。它的實現(xiàn)原理是通過將要寫入磁盤的數(shù)據(jù)先寫入到Doublewrite Buffer中的內(nèi)存緩存區(qū)域,然后再寫入到磁盤的兩個不同位置,來避免由于磁盤損壞等因素導(dǎo)致數(shù)據(jù)丟失或不一致的問題。Doublewrite Buffer對于保證MySQL數(shù)據(jù)的安全性和一致性具有重要意義。

到此這篇關(guān)于MySQL的雙寫緩沖區(qū)Doublewrite Buffer詳解的文章就介紹到這了,更多相關(guān)MySQL的雙寫緩沖區(qū)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

  • MySQL實現(xiàn)分頁查詢的方法

    MySQL實現(xiàn)分頁查詢的方法

    這篇文章介紹了MySQL實現(xiàn)分頁查詢的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • mysql外鍵(Foreign Key)介紹和創(chuàng)建外鍵的方法

    mysql外鍵(Foreign Key)介紹和創(chuàng)建外鍵的方法

    這篇文章主要介紹了mysql外鍵(Foreign Key)命令和添加外鍵方法,需要的朋友可以參考下
    2014-02-02
  • MySQL中的SQL標(biāo)準(zhǔn)語句詳解

    MySQL中的SQL標(biāo)準(zhǔn)語句詳解

    SQL(Structured?Query?Language)是“結(jié)構(gòu)化查詢語言”,它是對關(guān)系型數(shù)據(jù)庫的操作語言。雖然SQL可以用在所有關(guān)系型數(shù)據(jù)庫中,但很多數(shù)據(jù)庫還都有標(biāo)準(zhǔn)之后的一些語法,我們可以稱之為方言
    2022-09-09
  • mysql中tonumber函數(shù)使用及注意事項

    mysql中tonumber函數(shù)使用及注意事項

    在MySQL中,沒有直接的TO_NUMBER函數(shù),但可以通過CAST或CONVERT實現(xiàn)字符串到數(shù)字的轉(zhuǎn)換,轉(zhuǎn)換前需明確數(shù)據(jù)類型,了解轉(zhuǎn)換語法,并注意錯誤處理、空值處理、格式合規(guī)性和精度問題,本文介紹mysql中tonumber函數(shù)使用及注意事項,感興趣的朋友一起看看吧
    2025-02-02
  • 淺談MySQL數(shù)據(jù)庫崩潰(crash)的常見原因和解決辦法

    淺談MySQL數(shù)據(jù)庫崩潰(crash)的常見原因和解決辦法

    本文主要介紹了淺談MySQL數(shù)據(jù)庫崩潰(crash)的常見原因和解決辦法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • MySql CPU激增原因小結(jié)

    MySql CPU激增原因小結(jié)

    本文主要介紹了MySQL CPU激增的原因和解決方法,包括QPS激增、慢SQL和大量空閑連接導(dǎo)致的CPU升高,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-11-11
  • 最新評論

    奉贤区| 黔江区| 望都县| 广宗县| 高清| 乃东县| 固镇县| 盐亭县| 琼中| 灌云县| 博湖县| 霍城县| 临夏市| 嘉禾县| 蒙城县| 西乌珠穆沁旗| 大悟县| 布尔津县| 曲周县| 故城县| 贵德县| 镇巴县| 安福县| 海伦市| 那曲县| 山丹县| 佛冈县| 濉溪县| 渭南市| 新巴尔虎右旗| 马山县| 大连市| 永胜县| 通化县| 错那县| 葫芦岛市| 琼海市| 漯河市| 景泰县| 灵石县| 保靖县|