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

了解MySQL之Doublewrite Buffer使用

 更新時間:2025年08月29日 09:12:31   作者:DG0913L  
文章介紹了MySQL InnoDB的DoublewriteBuffer機制,通過內(nèi)存+磁盤的雙重寫入(先寫內(nèi)存,再順序追加到磁盤,最后寫數(shù)據(jù)文件)確保頁數(shù)據(jù)完整性,避免因掉電導(dǎo)致數(shù)據(jù)損壞,同時說明其工作原理及關(guān)鍵參數(shù)配置,強調(diào)性能影響較小

前言

上一篇文章MySQL之Adaptive Hash Index詳解我們學(xué)習(xí)了InnoDB Adaptive Hash Index自適應(yīng)哈希索引的工作原理。

其本質(zhì)是將頻繁訪問數(shù)據(jù)頁的索引鍵值以“Key”放在緩存中,“Value”為該索引鍵值匹配完整記錄所在頁面(Page)的位置,通過縮短尋路路徑(Search Path)從而提升MySQL查詢性能的一種方式。

今天我們就學(xué)習(xí)了解一下Doublewrite Buffer是什么?工作原理是怎樣的?(雙寫緩沖區(qū),縮寫:DWB

一、不同程序的page

這里我們需要知道的是Doublewrite BufferMySQL放在官檔目錄“磁盤結(jié)構(gòu)”中了,但真實情況是Doublewrite Buffer是內(nèi)存+磁盤的結(jié)構(gòu)。

官檔地址:https://dev.mysql.com/doc/refman/8.0/en/innodb-doublewrite-buffer.html

1.1 Linux系統(tǒng)的Page OR MySQL的Page 大小對比

操作系統(tǒng)可以看成是一個程序,作為程序而言,都有最小處理單位的說法,我們常見的服務(wù)器一般都是Linux操作系統(tǒng),對應(yīng)文件系統(tǒng)的頁(OS Page)就可以看成是Linux操作系統(tǒng)與文件系統(tǒng)交互的最小單位。

可以通過下面的命令來查看:

[root@mysql2 ~]# getconf PAGESIZE
4096

通過結(jié)果可以看出,Linux文件系統(tǒng)頁(OS Page)的大小是4KB

同樣地,MySQL作為一個程序也是有最小交互單位的,即InnoDB Buffer Pool能處理的最小單位,可以通過以下SQL命令查看:

mysql> show variables like '%innodb_page_size%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| innodb_page_size | 16384 |
+------------------+-------+
1 row in set (0.01 sec)

如上,MySQL頁(Page)大小默認(rèn)為16KB

1.2 不同大小Page的程序在交互過程中會出現(xiàn)什么問題

一般情況下,除了操作系統(tǒng)的頁(OS Page)為4KB之外,其余程序的頁(Page)都會大于等于操作系統(tǒng)的頁大小,比如,Oracle的Page大小為8KB。

MySQL的Page大小也可以通過上面innodb_page_size參數(shù)指定(5.6版本以前,不可調(diào)整;5.6版本時,可自定義為8KB、4KB,但不能調(diào)大;5.7版本以后,才可以改成32KB、64KB。我們使用默認(rèn)值即可。

我們知道操作系統(tǒng)的頁大小和MySQL的頁大小了,而且MySQL程序是跑在Linux操作系統(tǒng)上的,所以可以得出一個結(jié)論:MySQL將Buffer Pool中一頁數(shù)據(jù)刷入磁盤,要寫4個文件系統(tǒng)里的頁。

如上圖所示:

MySQL里Page 1的頁,物理上對應(yīng)磁盤的Page 1、Page 2、Page 3、Page 4四個頁,假設(shè)MySQL內(nèi)Page 1的頁準(zhǔn)備刷入磁盤,才刷了3個文件系統(tǒng)里的頁,掉電了,則會出現(xiàn)重啟后,MySQL內(nèi)Page 1的頁,物理上對應(yīng)磁盤上的Page 1、Page 2、Page 3三個頁,數(shù)據(jù)完整性被破壞。(Redo Log無法修復(fù)這類“頁數(shù)據(jù)損壞”的異常,修復(fù)的前提是“頁數(shù)據(jù)正確”并且Redo日志正常)

二、Doublewrite Buffer概念

針對上面出現(xiàn)的情況,如何解決這類“頁數(shù)據(jù)損壞”的問題呢?

很容易想到的方法是,能有一個“副本”,對原來的頁進行還原,這個存儲“副本”的地方,就是Doublewrite Buffer。

Doublewrite Buffer,它與傳統(tǒng)的“Buffer”又不同,它分為內(nèi)存和磁盤的兩層架構(gòu)。(傳統(tǒng)的“Buffer”,大部分是內(nèi)存存儲;而DWB里的數(shù)據(jù),是需要落地的)

三、Doublewrite Buffer工作流程

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

  • 頁數(shù)據(jù)先memcopy到DWB的內(nèi)存里;
  • DWB的內(nèi)存里的數(shù)據(jù)頁,會先刷到DWB的磁盤上;
  • DWB的內(nèi)存里的數(shù)據(jù)頁,再刷到數(shù)據(jù)磁盤存儲.ibd文件上;

DWB為什么能解決“頁數(shù)據(jù)損壞”問題呢?

假設(shè)步驟2掉電,磁盤里依然是Page 1、Page 2、Page 3、Page 4的完整數(shù)據(jù)。只要有頁數(shù)據(jù)完整,就能通過Redo Log還原數(shù)據(jù);假如步驟3掉電,DWB磁盤結(jié)構(gòu)里存儲著完整的數(shù)據(jù)。所以,一定不會出現(xiàn)“頁數(shù)據(jù)損壞”問題。同時寫了DWB磁盤和Data File,總有一個地方的數(shù)據(jù)是OK的

為什么叫Doublewrite?

步驟2和步驟3要寫2次磁盤,這就是“Doublewrite”的由來

能夠通過DWB保證頁數(shù)據(jù)的完整性,但畢竟DWB要寫兩次磁盤,會不會導(dǎo)致數(shù)據(jù)庫性能急劇降低呢?

  • 頁數(shù)據(jù)memcopy到DWB的內(nèi)存,速度很快;
  • DWB的內(nèi)存fsync刷到DWB的磁盤,屬于順序追加寫,速度也很快;
  • 刷磁盤,隨機寫,本來就需要進行,不屬于額外操作;
  • 另外,128頁(每頁16K)2M的DWB,會分兩次刷入磁盤,每次最多64頁,即1M的數(shù)據(jù)(所以圖中我們的DWB磁盤結(jié)構(gòu)分為了兩部分),執(zhí)行也是非常之快的。綜上,性能會有所影響,但影響并不大

四、Doublewrite Buffer的參數(shù)

我們使用如下命令查詢

mysql> show variables like '%double%';
+-------------------------------+-------+
| Variable_name                 | Value |
+-------------------------------+-------+
| innodb_doublewrite            | ON    |
| innodb_doublewrite_batch_size | 0     |
| innodb_doublewrite_dir        |       |
| innodb_doublewrite_files      | 2     |
| innodb_doublewrite_pages      | 4     |
+-------------------------------+-------+
5 rows in set (0.01 sec)


mysql> show global status like '%dblwr%';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Innodb_dblwr_pages_written | 489   |
| Innodb_dblwr_writes        | 176   |
+----------------------------+-------+
2 rows in set (0.00 sec)

4.1 innodb_doublewrite

Doublewrite Buffer是否啟用開關(guān),默認(rèn)是開啟狀態(tài),InnoDB將所有數(shù)據(jù)存儲兩次,首先到雙寫緩沖區(qū),然后到實際數(shù)據(jù)文件

如果關(guān)閉,需要在my.cnf文件中指定

[mysqld]
innodb_doublewrite = off

4.2 Innodb_dblwr_pages_written & Innodb_dblwr_writes

  • Innodb_dblwr_pages_written 是doublewrite寫的總的頁數(shù),即一共寫入了489頁
  • innodb_dblwr_writes是實際寫入的次數(shù)為176

如果兩個計數(shù)的比例遠(yuǎn)遠(yuǎn)小于64:1,則說明系統(tǒng)寫入壓力并不高。

4.3 innodb_doublewrite_batch_size

  • 控制要批量寫入的雙寫頁數(shù)。
  • 此變量用于高級性能調(diào)整。
  • 默認(rèn)值應(yīng)該適合大多數(shù)用戶(默認(rèn)值是0,最大值是256)

4.4 innodb_doublewrite_dir

  • 定義了目錄InnoDB創(chuàng)建雙寫文件。
  • 如果未指定innodb_data_home_dir目錄,則在目錄中創(chuàng)建雙寫文件,如果未指定,則默認(rèn)為數(shù)據(jù)目錄。

4.5 innodb_doublewrite_files

  • 定義了雙寫文件的數(shù)量。默認(rèn)情況下,為每個緩沖池實例創(chuàng)建兩個雙寫文件。
  • 雙寫文件的最大數(shù)量是緩沖池實例數(shù)量的兩倍。(緩沖池實例的數(shù)量由innodb_buffer_pool_instances變量控制)

Doublewrite文件名具有以下格式:

例如,以下雙寫文件是為頁面大小為16KB和單個緩沖池的MySQL實例創(chuàng)建的:

#ib_丨page_size_file_丨number.dblwr

所以我們的DWB文件就被創(chuàng)建成下面的模樣:

[root@mysql2 data]# ll \#ib_16384_*
-rw-r----- 1 mysql mysql  327680 5月   4 12:40 #ib_16384_0.dblwr
-rw-r----- 1 mysql mysql 8716288 4月  26 16:54 #ib_16384_1.dblwr

4.6 innodb_doublewrite_pages

控制每個線程雙寫頁的最大數(shù)目。如果未指定值,innodb_doublewrite_pages則設(shè)置為該innodb_write_io_threads值。

此變量用于高級性能調(diào)整。默認(rèn)值應(yīng)該適合大多數(shù)用戶。(最小值和默認(rèn)值一樣,都是innodb_write_io_threads的值,最大值是256)

今天主要講解了MySQL InnoDB Doublewrite Buffer的工作原理,通過流程圖的方式來說明Doublewrite Buffer的工作流程,偏理論的知識,內(nèi)容比較少也很好理解,大家理解記憶即可,面試也會遇到這個知識點。

總結(jié)

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

相關(guān)文章

  • Mysql8.0遞歸查詢的簡單用法示例

    Mysql8.0遞歸查詢的簡單用法示例

    在項目中會遇到同一個表中保存著父子關(guān)系的數(shù)據(jù),最常見的就是處理樹形結(jié)構(gòu)資源,這篇文章主要給大家介紹了關(guān)于Mysql8.0遞歸查詢的簡單用法,需要的朋友可以參考下
    2021-08-08
  • MyBatis-Plus查詢不到數(shù)據(jù)但使用SQL可以查詢到數(shù)據(jù)的問題排查解決

    MyBatis-Plus查詢不到數(shù)據(jù)但使用SQL可以查詢到數(shù)據(jù)的問題排查解決

    在使用MyBatis-Plus時,有時會出現(xiàn)查詢不到數(shù)據(jù)的問題,而直接執(zhí)行SQL卻能查詢到數(shù)據(jù),本文將介紹如何排查和解決這一問題,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-09-09
  • 如何解決mysql出現(xiàn)Incorrect string value for column ‘表項‘ at row 1錯誤問題

    如何解決mysql出現(xiàn)Incorrect string value for co

    這篇文章主要介紹了如何解決mysql出現(xiàn)Incorrect string value for column ‘表項‘ at row 1錯誤問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • 教你如何在Mac上安裝mysql數(shù)據(jù)庫

    教你如何在Mac上安裝mysql數(shù)據(jù)庫

    本文給大家詳細(xì)介紹了如何在Mac上安裝mysql數(shù)據(jù)庫的方法,非常的細(xì)致,有需要的小伙伴可以參考下
    2018-05-05
  • 從其他電腦訪問本機的Mysql的設(shè)置方法

    從其他電腦訪問本機的Mysql的設(shè)置方法

    如果需要讓特定的用戶從給定域(例如mydomain.com)的所有計算機上訪問 MySQL 服務(wù)器,你可以執(zhí)行在賬戶名的 host 部分使用了通配符“%” 的 GRANT 語句
    2008-11-11
  • 深入講解MySQL Innodb索引的原理

    深入講解MySQL Innodb索引的原理

    這篇文章主要給大家介紹了關(guān)于MySQL Innodb索引原理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用mysql具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • MySQL關(guān)聯(lián)查詢優(yōu)化實現(xiàn)方法詳解

    MySQL關(guān)聯(lián)查詢優(yōu)化實現(xiàn)方法詳解

    在數(shù)據(jù)庫的設(shè)計中, 我們通常都是會有很多張表 , 通過表與表之間的關(guān)系建立我們想要的數(shù)據(jù)關(guān)系, 所以在多張表的前提下, 多表的關(guān)聯(lián)查詢就尤為重要,這篇文章主要介紹了MySQL關(guān)聯(lián)查詢優(yōu)化
    2022-11-11
  • Mysql5.7修改root密碼教程

    Mysql5.7修改root密碼教程

    本文給大家分享的是個人在使用mysql5.7修改root密碼的時候遇到的問題,以及解決方法,推薦給有相同需求的小伙伴參考下。
    2016-02-02
  • MySQL自定義排序方法的使用小結(jié)

    MySQL自定義排序方法的使用小結(jié)

    本文介紹了MySQL中進行自定義排序的兩種方法,包含使用CASE語句和FIELD函數(shù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-12-12
  • CentOS7下二進制安裝mysql 5.7.23

    CentOS7下二進制安裝mysql 5.7.23

    這篇文章主要為大家詳細(xì)介紹了CentOS7下二進制安裝mysql 5.7.23,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06

最新評論

饶河县| 霍林郭勒市| 岳池县| 昌吉市| 铜鼓县| 延长县| 巧家县| 德安县| 武胜县| 金坛市| 涞水县| 界首市| 女性| 屯留县| 靖宇县| 敦煌市| 尼木县| 夏河县| 工布江达县| 基隆市| 陇南市| 梓潼县| 绥宁县| 阜南县| 曲麻莱县| 桂平市| 彩票| 义马市| 赣榆县| 府谷县| 大宁县| 沂南县| 石景山区| 姜堰市| 灵台县| 黑水县| 澳门| 临漳县| 哈尔滨市| 凭祥市| 长宁县|