真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

【MYSQL】innodb兩次寫(doublewrite)實現(xiàn)解析

   在innodb存儲引擎中,有一個叫doublewrite技術(shù)模塊,是可選的。它通過參數(shù)InnoDB_doublewrite的值來控制,如果為0表示不啟用,可以通過show status like  "%InnoDB_dblwr%"來查看,doublewrite技術(shù)帶給innodb存儲引擎的是數(shù)據(jù)頁的可靠性,下面對doublewrite技術(shù)進行解析,讓大家充分理解doublewrite是如何做到保障數(shù)據(jù)頁的可靠性。

一、doublewrite應(yīng)用場景:
    我們知道,innodb的數(shù)據(jù)頁一般大小是16KB,MySQL存取數(shù)據(jù)的最小單位也是頁,而操作系統(tǒng)并不能保障一個數(shù)據(jù)頁的原子性,也就是說當(dāng)寫入數(shù)據(jù)時,有可能在一個頁中寫入一半時(比如8K)數(shù)據(jù)庫宕機,這種情況稱為部分寫失效(partial page write),從而導(dǎo)致數(shù)據(jù)丟失。
      大家也許會問,難道我不可以根據(jù)redo log進行數(shù)據(jù)恢復(fù)嗎?答案是肯定的也是否定的,要分為兩種情況:1、數(shù)據(jù)庫宕機,物理文件完好無損,是可以通過redo log進行崩潰恢復(fù)。2、數(shù)據(jù)庫宕機,正在刷新到磁盤的頁發(fā)生partial page write,而正好在磁盤上的這個數(shù)據(jù)頁由于宕機發(fā)生損壞,這時就無法通過redo log進行數(shù)據(jù)恢復(fù)了,為什么?我們必須要清楚的認(rèn)識到,redo log里記錄的是對頁的物理操作!比如一條redo記錄"page number  xx,偏移量 800  寫記錄 “this is abc”",那當(dāng)頁損壞時,這條redo記錄還有意義嗎?于是在這種特殊情況下,doublewrite就派上用場啦!

二、doublewrite體系結(jié)構(gòu)及工作流程:
    doublewrite由兩部分組成,一部分為內(nèi)存中的doublewrite buffer,其大小為2MB,另一部分是磁盤上共享表空間(ibdata x)中連續(xù)的128個頁,即2個區(qū)(extent),大小也是2M。doublewrite工作流程如下:
        1、當(dāng)一系列機制(main函數(shù)觸發(fā)、checkpoint等)觸發(fā)數(shù)據(jù)緩沖池中的臟頁進行刷新時,并不直接寫磁盤,而是會通過memcpy函數(shù)將臟頁先復(fù)制到內(nèi)存中的doublewrite buffer,之后通過doublewrite buffer再分兩次、每次1MB順序?qū)懭牍蚕肀砜臻g的物理磁盤上。
        2、馬上調(diào)用fsync函數(shù),同步臟頁進磁盤
      由于在這個過程中,doublewrite頁的存儲時連續(xù)的,因此寫入磁盤為順序?qū)?,性能很高;完成doublewrite后,再將臟頁寫入實際的各個表空間文件,這時寫入就是離散的了。各模塊協(xié)作情況如下圖(第一步應(yīng)為臟頁產(chǎn)生的redo記錄logbuffer,然后logbuffer寫入redo log file,為簡化次要步驟直接連線表示):
              【MYSQL】innodb兩次寫(double write)實現(xiàn)解析
    查看doublewrite工作情況,可以執(zhí)行命令:
mysql> show global status like 'innodb_dblwr%'\G
*************************** 1. row ***************************
Variable_name: Innodb_dblwr_pages_written
        Value: 61932183
*************************** 2. row ***************************
Variable_name: Innodb_dblwr_writes
        Value: 15237891
2 rows in set (0.00 sec)
    以上數(shù)據(jù)顯示,doublewrite一共寫了 61932183個頁,一共寫了15237891次,從這組數(shù)據(jù)我們可以分析,之前講過在開啟doublewrite后,每次臟頁刷新必須要先寫doublewrite,而doublewrite存在于磁盤上的是兩個連續(xù)的區(qū),每個區(qū)由連續(xù)的頁組成,一般情況下一個區(qū)最多有64個頁,所以一次IO寫入應(yīng)該可以最多寫64個頁。而根據(jù)以上我這個系統(tǒng)Innodb_dblwr_pages_written與Innodb_dblwr_writes的比例來看,大概在4左右,遠(yuǎn)遠(yuǎn)還沒到64,所以從這個角度也可以看出,系統(tǒng)寫入壓力并不高。

三、崩潰恢復(fù)    
    如果操作系統(tǒng)在將頁寫入磁盤的過程中發(fā)生崩潰,如上圖,在恢復(fù)過程中,innodb存儲引擎可以從共享表空間的doublewrite中找到該頁的一個最近的副本,將其復(fù)制到表空間文件,再應(yīng)用redo log,就完成了恢復(fù)過程。因為有副本所以也不擔(dān)心表空間中數(shù)據(jù)頁是否損壞。

四、建議
    innodb存儲引擎引入double write技術(shù)后,參數(shù)skip_innodb_doublewrite雖然可以禁止使用doublewrite功能,但還是強烈建議大家使用doublewrite。避免部分寫失效問題,當(dāng)然,有些文件系統(tǒng)本身就提供了部分寫失效防范機制,如ZFS文件系統(tǒng),在這種情況下,就可以不開啟doublewrite了


        
當(dāng)前題目:【MYSQL】innodb兩次寫(doublewrite)實現(xiàn)解析
URL鏈接:http://weahome.cn/article/jdcsdi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部