亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

我們常見的服務(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)問題了。造成”頁(yè)數(shù)據(jù)損壞“。并且這種”頁(yè)數(shù)據(jù)損壞“靠 redo日志是無(wú)法修復(fù)的。

重做日志中記錄的是對(duì)頁(yè)的物理操作,而不是頁(yè)面的全量記錄,而如果發(fā)生partial page write(部分頁(yè)寫入)問題時(shí),出現(xiàn)問題的是未修改過的數(shù)據(jù),此時(shí)重做日志(Redo Log)無(wú)能為力。寫doublewrite buffer成功了,這個(gè)問題就不用擔(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ù)奈恢?。如果在寫?yè)的過程中發(fā)生意外崩潰,InnoDB在稍后的恢復(fù)過程中在doublewrite buffer中找到完好的page副本用于恢復(fù)。

Doublewrite Buffer原理

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

  1. 頁(yè)數(shù)據(jù)先通過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è)寫入磁盤的過程中發(fā)生了崩潰,在恢復(fù)過程中,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è),跳過該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ù)的過程中,數(shù)據(jù)庫(kù)都會(huì)檢查頁(yè)面是不是合法(校驗(yàn)等等),如果發(fā)現(xiàn)一個(gè)頁(yè)面校驗(yàn)結(jié)果不一致,則此時(shí)會(huì)用到雙寫這個(gè)功能。

我們可以通過如下命令來(lái)監(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ù)存儲(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)原理是通過將要寫入磁盤的數(shù)據(jù)先寫入到Doublewrite Buffer中的內(nèi)存緩存區(qū)域,然后再寫入到磁盤的兩個(gè)不同位置,來(lái)避免由于磁盤損壞等因素導(dǎo)致數(shù)據(jù)丟失或不一致的問題。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如何導(dǎo)出篩選數(shù)據(jù)并導(dǎo)出帶表頭的csv文件

    Mysql如何導(dǎo)出篩選數(shù)據(jù)并導(dǎo)出帶表頭的csv文件

    這篇文章主要介紹了Mysql如何導(dǎo)出篩選數(shù)據(jù)并導(dǎo)出帶表頭的csv文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • mysql分表之后如何平滑上線詳解

    mysql分表之后如何平滑上線詳解

    項(xiàng)目開發(fā)中,我們的數(shù)據(jù)庫(kù)數(shù)據(jù)越來(lái)越大,隨之而來(lái)的是單個(gè)表中數(shù)據(jù)太多,以至于查詢書讀變慢,當(dāng)出現(xiàn)這種情況時(shí),我們可以考慮分表,這篇文章主要給大家介紹了關(guān)于mysql分表之后如何平滑上線的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • MySQL用truncate命令快速清空一個(gè)數(shù)據(jù)庫(kù)中的所有表

    MySQL用truncate命令快速清空一個(gè)數(shù)據(jù)庫(kù)中的所有表

    這篇文章主要介紹了MySQL用truncate命令快速清空一個(gè)數(shù)據(jù)庫(kù)中的所有表,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • mysql 5.7.9 免安裝版配置方法圖文教程

    mysql 5.7.9 免安裝版配置方法圖文教程

    這篇文章主要為大家分享了mysql 5.7.9 免安裝版配置方法圖文教程,感興趣的小伙伴們可以參考一下
    2016-08-08
  • MySQL鎖等待超時(shí)問題的原因和解決方案(Lock wait timeout exceeded; try restarting transaction)

    MySQL鎖等待超時(shí)問題的原因和解決方案(Lock wait timeout exceed

    在數(shù)據(jù)庫(kù)開發(fā)和管理中,鎖等待超時(shí)是一個(gè)常見而棘手的問題,對(duì)于使用 MySQL 的應(yīng)用程序,尤其是采用 InnoDB 存儲(chǔ)引擎的場(chǎng)景,這一問題更是屢見不鮮,本文給大家介紹了MySQL鎖等待超時(shí)問題的原因和解決方案,需要的朋友可以參考下
    2024-11-11
  • MySQL字段自增自減的SQL語(yǔ)句示例介紹

    MySQL字段自增自減的SQL語(yǔ)句示例介紹

    MySQL的自增語(yǔ)句大家應(yīng)該都很熟悉,本文為大家介紹下MySQL字段自增自減的SQL語(yǔ)句,需要的朋友可以參考下
    2014-02-02
  • Mysql中強(qiáng)制索引的具體使用

    Mysql中強(qiáng)制索引的具體使用

    Mysql強(qiáng)制索引可以通過強(qiáng)制使用某些列的索引來(lái)提高查詢的性能,本文就來(lái)介紹一下Mysql中強(qiáng)制索引的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-08-08
  • Mysql中between...and引起的索引失效問題及解決

    Mysql中between...and引起的索引失效問題及解決

    這篇文章主要介紹了Mysql中between...and引起的索引失效問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Mysql錯(cuò)誤Every derived table must have its own alias解決方法

    Mysql錯(cuò)誤Every derived table must have its own alias解決方法

    這篇文章主要介紹了Mysql錯(cuò)誤Every derived table must have its own alias解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • 詳解mysql權(quán)限和索引

    詳解mysql權(quán)限和索引

    本篇文章給大家詳細(xì)分析了mysql的權(quán)限和索引相關(guān)知識(shí)要點(diǎn),有這方面需要的朋友參考學(xué)習(xí)下。
    2018-01-01

最新評(píng)論