亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

【MYSQL】innodb兩次寫(double write)實現解析

發布時間:2020-08-11 13:56:05 來源:ITPUB博客 閱讀:435 作者:ai3707 欄目:MySQL數據庫
   在innodb存儲引擎中,有一個叫doublewrite技術模塊,是可選的。它通過參數InnoDB_doublewrite的值來控制,如果為0表示不啟用,可以通過show status like  "%InnoDB_dblwr%"來查看,doublewrite技術帶給innodb存儲引擎的是數據頁的可靠性,下面對doublewrite技術進行解析,讓大家充分理解doublewrite是如何做到保障數據頁的可靠性。

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

二、doublewrite體系結構及工作流程
    doublewrite由兩部分組成,一部分為內存中的doublewrite buffer,其大小為2MB,另一部分是磁盤上共享表空間(ibdata x)中連續的128個頁,即2個區(extent),大小也是2M。doublewrite工作流程如下:
        1、當一系列機制(main函數觸發、checkpoint等)觸發數據緩沖池中的臟頁進行刷新時,并不直接寫磁盤,而是會通過memcpy函數將臟頁先復制到內存中的doublewrite buffer,之后通過doublewrite buffer再分兩次、每次1MB順序寫入共享表空間的物理磁盤上。
        2、馬上調用fsync函數,同步臟頁進磁盤
      由于在這個過程中,doublewrite頁的存儲時連續的,因此寫入磁盤為順序寫,性能很高;完成doublewrite后,再將臟頁寫入實際的各個表空間文件,這時寫入就是離散的了。各模塊協作情況如下圖(第一步應為臟頁產生的redo記錄logbuffer,然后logbuffer寫入redo log file,為簡化次要步驟直接連線表示):
              【MYSQL】innodb兩次寫(double write)實現解析
    查看doublewrite工作情況,可以執行命令:
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)
    以上數據顯示,doublewrite一共寫了 61932183個頁,一共寫了15237891次,從這組數據我們可以分析,之前講過在開啟doublewrite后,每次臟頁刷新必須要先寫doublewrite,而doublewrite存在于磁盤上的是兩個連續的區,每個區由連續的頁組成,一般情況下一個區最多有64個頁,所以一次IO寫入應該可以最多寫64個頁。而根據以上我這個系統Innodb_dblwr_pages_written與Innodb_dblwr_writes的比例來看,大概在4左右,遠遠還沒到64,所以從這個角度也可以看出,系統寫入壓力并不高。

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

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


        
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

辉南县| 霍林郭勒市| 金昌市| 横山县| 博罗县| 红河县| 光泽县| 丰台区| 河北区| 扬中市| 九龙县| 平湖市| 锦屏县| 元江| 辽源市| 营山县| 同江市| 茌平县| 德庆县| 安西县| 平利县| 垣曲县| 南开区| 积石山| 阳江市| 丰都县| 成武县| 化德县| 临西县| 西安市| 当阳市| 石台县| 敖汉旗| 始兴县| 法库县| 阿克陶县| 临沧市| 龙口市| 保亭| 上高县| 新竹县|