在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就派上用場啦!