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

MYSQL之Doublewrite?Buffer雙寫緩存區(qū)詳解

 更新時間:2025年08月29日 10:06:30   作者:程序猿夏夏夏  
由于MySQL頁(16KB)與Linux文件系統(tǒng)頁(4KB)不匹配,可能導(dǎo)致部分頁寫入損壞,Redo日志無法修復(fù),Doublewrite?Buffer通過內(nèi)存+磁盤雙緩沖確保數(shù)據(jù)可靠性,與Redo日志協(xié)作實現(xiàn)故障恢復(fù),相關(guān)參數(shù)用于配置

為什么需要Doublewrite Buffer

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

可以使用如下命令查看MySQL的Page大小:

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機器斷電了,這時候就會出現(xiàn)問題了。造成「頁數(shù)據(jù)損壞」。并且這種頁數(shù)據(jù)損壞靠 redo日志是無法修復(fù)的。

redo重做日志中記錄的是對頁的物理操作,而不是頁面的全量記錄,當發(fā)生「Partial Page Write(部分頁寫入)」問題時,出現(xiàn)問題的是未修改過的數(shù)據(jù),此時redo日志無能為力。

如何解決Linux機器斷電,刷頁到一半機器奔潰的問題

Doublewrite Buffer的出現(xiàn)就是為了解決上面的這種情況,給InnoDB存儲引擎提供了數(shù)據(jù)頁的可靠性,雖然名字帶了Buffer,但實際上Doublewrite Buffer是「內(nèi)存+磁盤」的結(jié)構(gòu)。

  • 1、內(nèi)存結(jié)構(gòu):Doublewrite Buffer內(nèi)存結(jié)構(gòu)由128個頁(Page)構(gòu)成,大小是2MB。
  • 2、磁盤結(jié)構(gòu):Doublewrite Buffer磁盤結(jié)構(gòu)在系統(tǒng)表空間上是128個頁(2個區(qū),extend1和extend2),大小是2MB。

Doublewrite Buffer的原理是,再把數(shù)據(jù)頁寫到數(shù)據(jù)文件之前,InnoDB先把它們寫到一個叫「doublewrite buffer(雙寫緩沖區(qū))」的共享表空間內(nèi),在寫doublewrite buffer完成后,InnoDB才會把頁寫到數(shù)據(jù)文件適當?shù)奈恢谩?/p>

如果在寫頁的過程中發(fā)生意外崩潰,InnoDB會在doublewrite buffer中找到完好的page副本用于恢復(fù)。

doublewrite buffer原理

如上圖所示,當有數(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文件上(離散寫)。

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

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

我們可以通過如下命令來監(jiān)控Doublewrite Buffer工作負載,該命令用于顯示有關(guān)雙寫緩沖區(qū)(doublewrite buffer)的統(tǒng)計信息。‘%dblwr%’ 是一個通配符,匹配所有包含 ‘dblwr’ 的狀態(tài)變量。

show global status like '%dblwr%';

輸出

| Variable_name          | Value |
+------------------------+-------+
| Innodb_dblwr_writes    | 1000  |
| Innodb_dblwr_pages_written | 8000  |

Doublewrite Buffer和redo log

在MySQL的InnoDB存儲引擎中,Redo log和Doublewrite Buffer共同工作以確保數(shù)據(jù)的持久性和恢復(fù)能力。

1、當有一個DML(如INSERT、UPDATE)操作發(fā)生時, InnoDB會首先將這個操作寫入redo log(內(nèi)存)。這些日志被稱為未檢查點(uncheckpointed)的redo日志。

2、然后,在修改內(nèi)存中相應(yīng)的數(shù)據(jù)頁之前,需要將這些更改記錄在磁盤上。但是直接把這些修改的頁寫到其真正的位置可能會因發(fā)生故障導(dǎo)致頁部分更新,從而導(dǎo)致數(shù)據(jù)不一致。因此,InnoDB的做法是先將這些修改的頁按順序?qū)懭雂oublewrite buffer。這就是為什么叫做 “doublewrite” —— 數(shù)據(jù)實際上被寫了兩次,先在doublewrite buffer,然后在它們真正的位置。

3、一旦這些頁被安全地寫入doublewrite buffer,它們就可以按原始的順序?qū)懟氐轿募到y(tǒng)中。即使這個過程在寫回數(shù)據(jù)時發(fā)生故障,我們?nèi)匀豢梢詮膁oublewrite buffer中恢復(fù)數(shù)據(jù)。

4、最后,當事務(wù)提交時,相關(guān)聯(lián)的redo log會被寫入磁盤。這樣即使系統(tǒng)崩潰,redo log也可以用來重播(replay)事務(wù)并恢復(fù)數(shù)據(jù)庫。

在系統(tǒng)恢復(fù)期間,InnoDB會檢查doublewrite buffer,并嘗試從中恢復(fù)損壞的數(shù)據(jù)頁。如果doublewrite buffer中的數(shù)據(jù)是完整的,那么InnoDB就會用doublewrite buffer中的數(shù)據(jù)來更新?lián)p壞的頁。否則,如果doublewrite buffer中的數(shù)據(jù)不完整,InnoDB也有可能丟棄buffer內(nèi)容,重新執(zhí)行那條redo log以嘗試恢復(fù)數(shù)據(jù)。

所以,Redo log和Doublewrite Buffer的協(xié)作可以確保數(shù)據(jù)的完整性和持久性。如果在寫入過程中發(fā)生故障,我們可以從doublewrite buffer中恢復(fù)數(shù)據(jù),并通過redo log來進行事務(wù)的重播。

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

  • innodb_doublewrite:這個參數(shù)用于啟用或禁用雙寫緩沖區(qū)。設(shè)置為1時啟用,設(shè)置為0時禁用, 默認值為1。
  • innodb_doublewrite_files:這個參數(shù)定義了多少個雙寫文件被使用。默認值為2,有效范圍從2到127。
  • innodb_doublewrite_dir:這個參數(shù)指定了存儲雙寫緩沖文件的目錄的路徑。默認為空字符串,表示將文件存儲在數(shù)據(jù)目錄中。
  • innodb_doublewrite_batch_size: 這個參數(shù)定義了每次批處理操作寫入的字節(jié)數(shù)。默認值為0,表示InnoDB會選擇最佳的批量大小。
  • innodb_doublewrite_pages:這個參數(shù)定義了每個雙寫文件包含多少頁面。默認值為128。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 全面解析MySQL?Explain如何優(yōu)化SQL查詢性能

    全面解析MySQL?Explain如何優(yōu)化SQL查詢性能

    在?MySQL?中,EXPLAIN?關(guān)鍵字可以幫助我們分析查詢執(zhí)行計劃,從而優(yōu)化查詢性能,所以本文就來和大家詳細講講Explain是如何優(yōu)化SQL查詢性能的
    2023-05-05
  • Mysql中count(*)、count(1)、count(主鍵id)與count(字段)的區(qū)別

    Mysql中count(*)、count(1)、count(主鍵id)與count(字段)的區(qū)別

    本文主要介紹了Mysql中count(*)、count(1)、count(主鍵id)與count(字段)的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 如何用命令行進入mysql具體操作步驟

    如何用命令行進入mysql具體操作步驟

    逛論壇時無意發(fā)現(xiàn)有個伙計提出這樣的問題,如何用命令行進入mysql,搜集整理了一些特意貼出來與大家分享,感興趣的你可以參考下希望對你有所幫助
    2013-03-03
  • Mysql用戶創(chuàng)建以及權(quán)限賦予操作的實現(xiàn)

    Mysql用戶創(chuàng)建以及權(quán)限賦予操作的實現(xiàn)

    在MySQL中,創(chuàng)建新用戶并為其授予權(quán)限是一項常見的操作,本文主要介紹了Mysql用戶創(chuàng)建以及權(quán)限賦予操作的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • 修改MySQL數(shù)據(jù)庫引擎為InnoDB的操作

    修改MySQL數(shù)據(jù)庫引擎為InnoDB的操作

    這篇文章主要介紹了修改MySQL數(shù)據(jù)庫引擎為InnoDB的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 解決mysql插入數(shù)據(jù)鎖等待超時報錯:Lock?wait?timeout?exceeded;try?restarting?transaction

    解決mysql插入數(shù)據(jù)鎖等待超時報錯:Lock?wait?timeout?exceeded;try?restar

    這篇文章主要介紹了解決mysql插入數(shù)據(jù)鎖等待超時報錯:Lock?wait?timeout?exceeded;try?restarting?transaction問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • SQL查詢表字段信息詳細圖文教程

    SQL查詢表字段信息詳細圖文教程

    最近工作用到SQL語句查詢表中所有字段的名稱,下面這篇文章主要給大家介紹了關(guān)于SQL查詢表字段信息的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-03-03
  • MySQL 8 中的一個強大功能 JSON_TABLE示例詳解

    MySQL 8 中的一個強大功能 JSON_TABLE示例詳解

    JSON_TABLE是 MySQL 8中引入的一個強大功能,它允許用戶將JSON 數(shù)據(jù)轉(zhuǎn)換為關(guān)系表格式,從而可以更方便地在 SQL 查詢中處理 JSON 數(shù)據(jù),本文給大家介紹MySQL 8中的一個強大功能 JSON_TABLE,感興趣的朋友一起看看吧
    2025-07-07
  • MySQL分區(qū)字段列有必要再單獨建索引嗎?

    MySQL分區(qū)字段列有必要再單獨建索引嗎?

    這篇文章主要給大家介紹了關(guān)于MySQL分區(qū)字段列是否有必要再單獨建索引的相關(guān)資料,文中通過示例進行了驗證,對大家的理解和學(xué)習(xí)具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-10-10
  • MySQL 使用 Performance Schema 定位和解決慢 SQL 問題

    MySQL 使用 Performance Schema 定位和解決慢 

    本文介紹了如何使用MySQL的PerformanceSchema來定位和解決慢SQL查詢問題,通過啟用PerformanceSchema并分析相關(guān)的系統(tǒng)表,可以收集到詳細的性能數(shù)據(jù),從而識別出影響性能的SQL語句,優(yōu)化策略包括優(yōu)化查詢語句、調(diào)整數(shù)據(jù)庫配置等
    2025-02-02

最新評論

天镇县| 枞阳县| 疏附县| 增城市| 泾源县| 张北县| 涞源县| 清水河县| 灵宝市| 盐池县| 图片| 张北县| 陈巴尔虎旗| 阳谷县| 泾阳县| 紫阳县| 大兴区| 河东区| 靖边县| 若尔盖县| 剑川县| 咸阳市| 固阳县| 龙井市| 湘潭县| 集贤县| 崇礼县| 丹棱县| 德兴市| 鸡西市| 岑巩县| 九寨沟县| 咸丰县| 远安县| 新民市| 洪洞县| 平昌县| 平泉县| 合山市| 通河县| 正宁县|