【mysql】Innodb三大特性之double write

1、doublewrite buffermysql官方的介紹

InnoDB uses a novel file flush technique called doublewrite. Before writing pages to the data files, InnoDB first writes them to a contiguous area called the doublewrite buffer. Only after the write and the flush to the doublewrite buffer have completed, does InnoDB write the pages to their proper positions in the data file. If there is an operating system, storage subsystem, or mysqld process crash in the middle of a page write, InnoDB can later find a good copy of the page from the doublewrite buffer during crash recovery.

Although data is always written twice, the doublewrite buffer does not require twice as much I/O overhead or twice as many I/O operations. Data is written to the buffer itself as a large sequential chunk, with a single fsync() call to the operating system.

To turn off the doublewrite buffer, specify the option innodb_doublewrite=0.

2、partial page write

?

數據庫,OS和磁盤讀寫的基本單位是塊,也可以稱之為(page size)block size。

數據庫的塊一般為8K,16K;而OS的塊則一般為4K;IO塊則更小,linux內核要求IO block size<=OS block size。

磁盤IO除了IO block size,還有一個概念是扇區(IO sector),扇區是磁盤物理操作的基本單位,而IO 塊是磁盤操作的邏輯單位,一個IO塊對應一個或多個扇區,扇區大小一般為512個字節。

所以各個塊大小的關系可以梳理如下:

?

DB block > OS block >= IO block > 磁盤 sector,而且他們之間保持了整數倍的關系。比如我的系統各個塊的大小如下,DB以mysql為例,OS以linux為例

DB block size

mysql> show variables like 'innodb_page_size';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| innodb_page_size | 16384 |
+------------------+-------+

OS block

[root@dev ~]# getconf PAGESIZE
4096

IO block size

[root@dev ~]# blockdev --getbsz /dev/sda1 
1024

sector size 

[root@dev ~]# fdisk -l | grep Sector
Sector size (logical/physical): 512 bytes / 512 bytes

從上面的結果可以看到DB page=4*OS page=16*IO page=32*sector size

由于任何DB page的寫入,最終都會轉為sector的寫入,如果在寫磁盤的過程中,出現異常重啟,就可能會發生一個DB頁只寫了部分sector到磁盤,進而出現頁斷裂的情況 

?

InnoDB 的Page Size一般是16KB,其數據校驗也是針對這16KB來計算的,將數據寫入到磁盤是以Page為單位進行操作的。而計算機硬件和操作系統,在極端情況下 (比如斷電)往往并不能保證這一操作的原子性,16K的數據,寫入4K 時,發生了系統斷電/os crash ,只有一部分寫是成功的,這種情況下就是 partial page write 問題。

很多DBA 會想到系統恢復后,MySQL 可以根據redo log 進行恢復,而mysql在恢復的過程中是檢查page的checksum,checksum就是pgae的最后事務號,發生partial page write 問題時,page已經損壞,找不到該page中的事務號,就無法恢復

所以說,當page 損壞之后,其實應用redo是沒有意義的,這時候無法使用redo來恢復,因為原始頁已經損壞了,會發生數據丟失。

3、doublewrite

在InnoDB將BP中的Dirty Page刷(flush)到磁盤上時,首先會將(memcpy函數)Page刷到InnoDB tablespace的一個區域中,我們稱該區域為Double write Buffer(大小為2MB,每次寫入1MB,128個頁)。在向Double write Buffer寫入成功后,第二步、再將數據拷貝到數據文件對應的位置

當第二步過程中發生故障,也就是發生partial page write的問題。恢復的時候先檢查頁內的checksum是否相同,不一致,則直接從doublewrite中恢復

1)如果寫dw buffer失敗,那么這些數據不會寫到磁盤,innodb會載入磁盤原始數據和redo日志比較,并重新刷到dw buffer。
2)如果寫dw buffer成功,但是刷新到磁盤失敗,那么innodb就不會通過事務日志來恢復了,而是直接刷新dw buffer中的數據。

4、對性能的影響

系統需要將數據寫兩份,一般認為,Double Write是會降低系統性能的。peter猜測可能會有5-10%的性能損失,但是因為實現了數據的一致,是值得的。Mark Callaghan認為這應該是存儲層面應該解決的問題,放在數據庫層面無疑是犧牲了很多性能的。

事實上,Double Write對性能影響并沒有你想象(寫兩遍性能應該降低了50%吧?)的那么大。在BP中一次性往往會有很多的Dirty Page同時被flush,Double Write則把這些寫操作,由隨機寫轉化為了順序寫。而在Double Write的第二個階段,因為Double Write Buffer中積累了很多Dirty Page,所以向真正的數據文件中寫數據的時候,可能有很多寫操作可以合并,這樣有可能會降低Fsync的調用次數。

基于上面的原因,Double Write并沒有想象的那么糟。另外,Dimitri在測試后,發現打開和關閉Double Write對效率的影響并不大。

5、doublewrite參數

mysql> show variables like "%double%";
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| innodb_doublewrite | ON    |
+--------------------+-------+
1 row in set (0.00 sec)mysql> SHOW STATUS LIKE "%innodb_dblwr%";
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Innodb_dblwr_pages_written | 447   |
| Innodb_dblwr_writes        | 38    |
+----------------------------+-------+
2 rows in set (0.00 sec)

從上面可以看出, Flush了447次到doublewrite buffer中,寫文件共38次,則每次write合并了447/38次flush

?

參考文章

http://www.percona.com/blog/2006/08/04/innodb-double-write/
http://www.percona.com/doc/percona-server/5.5/performance/innodb_doublewrite_path.html?id=percona-server:features:percona_innodb_doublewrite_path
http://dev.mysql.com/doc/refman/5.0/en/innodb-disk-io.html
http://www.mysqlperformanceblog.com/2006/08/04/innodb-double-write/
http://www.facebook.com/note.php?note_id=107329775932
http://dimitrik.free.fr/blog/archives/2009/08/entry_86.html
http://www.cnblogs.com/cchust/p/3961260.html

?

轉載于:https://www.cnblogs.com/chenpingzhao/p/4876282.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/news/397410.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/397410.shtml
英文地址,請注明出處:http://en.pswp.cn/news/397410.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

android crop 大圖,com.android.camera.action.CROP 實現圖片剪裁

APP 中選取圖片之后&#xff0c;有時候需要進行剪裁&#xff0c;比如頭像。以下是啟動代碼。在我的項目中&#xff0c;傳的是 filePath&#xff0c;所以我轉了一下&#xff0c;但實際上從相冊選擇圖片后&#xff0c;用 data.getData() 就可獲得 uri。Uri uri Uri.fromFile(new…

Who Gets the Most Candies? POJ - 2886 (線段樹)

按順時針給出n個小孩&#xff0c;n個小孩每個人都有一個紙&#xff0c;然后每個人都有一個val&#xff0c;這個val等于自己的因子數&#xff0c;如果這個val是正的&#xff0c;那就順時針的第val個孩子出去&#xff0c;如果是負的話&#xff0c;就逆時針的第val個孩子出去&…

javax.validation.ValidationException: Unable to find a default provider

2019獨角獸企業重金招聘Python工程師標準>>> [ERROR] [2016-11-16 13:58:21 602] [main] (FrameworkServlet.java:457) Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name org.springframewo…

第十章練習題----2

package com.Hanqi2;public class xitizhuhanshu {public static void main(String[] args) {// TODO Auto-generated method stubxiti tm new xiti("黑色","15寸");xitizhs tm3 new xitizhs("藍色","15寸");tm.Call("654"…

關于微信“被返回頁”在被返回時自動刷新

網上有很多這些文章&#xff0c;但我覺得沒一篇真正解決這個問題&#xff0c;倒是能給人一個解決方案的思路&#xff0c;對&#xff0c;就是posState事件。 要解決這個問題也不難&#xff0c;使用history的replaceState屬性替換當前網頁鏈接&#xff08;其實作用是在不增加hist…

android視頻播放器api,03.視頻播放器Api說明

03.視頻播放器Api說明目錄介紹01.最簡單的播放02.如何切換視頻內核03.切換視頻模式04.切換視頻清晰度05.視頻播放監聽06.列表中播放處理07.懸浮窗口播放08.其他重要功能Api09.播放多個視頻10.VideoPlayer相關Api11.Controller相關Api12.邊播放邊緩存api13.類似抖音視頻預加載14…

使用Python重命名MP3標簽

從Window復制MP3文件的到Ubuntu下&#xff0c;MP3標簽很多是亂碼。于是想自己寫個Python程序處理一下。 從酷狗復制過來的音樂文件名都是“作者 - 標題”&#xff0c;所以可以通過解析文件名直接獲取作者和標題信息。 需要下載eyeD3模塊 $ sudo apt-get install python-eyed3 代…

Taurus.MVC 2.0 開源發布:WebAPI開發教程

背景&#xff1a; 有用戶反映&#xff0c;Tausus.MVC 能寫WebAPI么&#xff1f; 能&#xff01; 教程呢&#xff1f; 嗯&#xff0c;木有&#xff01; 好吧&#xff0c;剛好2.0出來&#xff0c;就帶上WEBAPI教程了&#xff01; 開源地址&#xff1a; https://github.com/cyq116…

android 鎖屏 home,android 鎖屏界面禁用長按home 和menu(recent apps)

android 5.1 系統中public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) {//檢查當前是否鎖屏&#xff0c; 可以添加getTopApp()判斷當前activity 來屏蔽2398 final boolean keyguardOn keyguardOn();添加新的方法&#xff1a;//獲…

Chrome瀏覽器調試踩坑

Chrome瀏覽器若在響應式狀態下&#xff0c;頁面縮放比例不是100%&#xff0c;元素會“竄位”&#xff0c;點擊元素會點擊到元素周圍的元素 Chrome頁面縮放比例不為100%時&#xff0c;table的單元格就算沒有邊框&#xff08;CSS去掉了&#xff09;也會顯示出邊框&#xff08;縫隙…

WordPress 博客文章時間格式the_time()設置

國外設計的WordPress 主題里的文章的時間格式是類似“十一月 21, 2010”這種格式的&#xff0c;而中國人習慣的是年在前&#xff0c;月緊跟其后&#xff0c;日在末尾&#xff0c;所以看國外的就顯得很別扭&#xff0c;但是我們可以通過修改WP時間代碼來設置成為我們中國人習慣的…

linux yum

更改linux YUM源方法&#xff1a;第一步&#xff1a;進入yum配置文件目錄&#xff1a;cd /etc/yum.repos.d/第二步&#xff1a;備份配置文件&#xff1a;mv CentOS-Base.repo CentOS-Base.repo.bak第三步&#xff1a;下載網易的配置&#xff08;或其他源配置文件&#xff09;&a…

chrome瀏覽器去掉緩存的方法

方法一&#xff1a; 1.開發說打開開發者工具 勾選這個訪問可以 方法二: commandshiftR 轉載于:https://www.cnblogs.com/kaibindirver/p/9378572.html

Apache Tomcat目錄下各個文件夾的作用

1.bin&#xff1a;存放各種不同平臺開啟與關閉Tomcat的腳本文件。 2.lib&#xff1a;存tomcat與web應用的Jar包。 3.conf&#xff1a;存放tomcat的配置文件。 4.webapps&#xff1a;web應用的發布目錄。 5.work&#xff1a;tomcat把由各種jsp生成的servlet文件存放的地方。 6.l…

sony z2 android 5.0,索尼Xperia Z2 5.0 root教程_索尼Z2獲取5.0系統的root

來說一下咱們的索尼Xperia Z2手機的5.0系統的root&#xff0c;因為現在很多機友的系統是5.0的&#xff0c;可是對于5.0的系統很多機友還不知道如何進行root操作&#xff0c;之前的針對4.4的系統的root方法肯定是用不到5.0的系統上的&#xff0c;因此需要專門的針對5.0的root軟件…

ABP文檔 - Javascript Api - AJAX

本節內容&#xff1a; AJAX操作相關問題ABP的方式 AJAX 返回信息處理錯誤 HTTP 狀態碼WrapResult和DontWrapResult特性 Asp.net Mvc 控制器Asp.net Web Api 控制器動態Web Api層Asp.net Core 控制器動態Web Api層AJAX操作相關問題 執行一個AJAX調用在現在的應用里非常常見&…

視達配色教程17 灰色的色彩意象是什么

視達配色教程17 灰色的色彩意象是什么 一、總結 一句話總結&#xff1a;沒有個性的色彩 1、灰色的一般意象是什么&#xff1f; 所有混沌的情感不友好的色彩可怕、恐怖和殘忍感情貧乏或者內向年齡和年老遺忘的過去貧困與謙虛劣等的顏色秘密與非法合適的中等-男式時裝的標準 二、…

AngularJs 相應回車事件

最近做項目&#xff0c;要用到AngularJs&#xff0c;之前也有用過一點點&#xff0c;但僅限于數據的綁定&#xff0c;這次項目要整個前端需要使用這個框架&#xff0c;可能是不熟悉的原因&#xff0c;感覺這代碼搞起來非常的不便利&#xff0c;&#xff1b;現總結一個響應回車事…

android6流暢,Android應用流暢(Seamlessness)設計

即使你的應用程序是快速且響應靈敏的&#xff0c;但一些設計仍然會給用戶造成問題——與其它應用程序或對話框未事先計劃的交互&#xff0c;意外的數據丟失&#xff0c;意料之外的阻塞等 等。避免這些問題&#xff0c;有助于理解應用程序運行的上下文和系統的交互過程&#xff…

stack overflow--技術問答網站

轉自&#xff1a;http://baike.baidu.com/link?urleMR6Pwdk9IkauI5B3nZb2Yo3VUAcK6vQfrMpcSMPWqgH0ngqFkup3Gdr3t_s_yZe_UFwkR8c1pboaxhEuY-iwF_nGiUYHajEPMO6Y1kqWvT8aPz7a_T6t3a1vxyTccgKl_UIx1cU-6IP7qjre2ijtq Stack Overflow是一個與程序相關的IT技術問答網站。用戶可以在…