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

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

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

為什么需要Doublewrite Buffer

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

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

SHOW VARIABLES LIKE 'innodb_page_size';

一般情況下,其余程序因?yàn)樾枰僮飨到y(tǒng)交互,它們的頁(yè)(Page)都會(huì)大于等于操作系統(tǒng)的頁(yè)大小,為整數(shù)倍。比如,Oracle的Page大小為8KB。

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

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

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

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

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

Doublewrite Buffer原理

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

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

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

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

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

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

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

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

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

show global status like '%dblwr%';

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

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

總結(jié)

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

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

您可能感興趣的文章:

相關(guān)文章

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

    MySQL實(shí)現(xiàn)分頁(yè)查詢的方法

    這篇文章介紹了MySQL實(shí)現(xiàn)分頁(yè)查詢的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(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)語(yǔ)句詳解

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

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

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

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

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

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

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

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

    三江| 江油市| 连云港市| 儋州市| 韩城市| 金秀| 巧家县| 个旧市| 肥城市| 六安市| 衡南县| 宜春市| 安龙县| 内丘县| 肥乡县| 江孜县| 行唐县| 任丘市| 景洪市| 仙桃市| 如皋市| 阳春市| 南京市| 太白县| 台北市| 宿松县| 兖州市| 平定县| 桐乡市| 桐庐县| 连平县| 司法| 洛阳市| 历史| 同仁县| 仙桃市| 荔波县| 乡宁县| 广州市| 惠州市| 阳信县|