在innodb存儲(chǔ)引擎中,有一個(gè)叫doublewrite技術(shù)模塊,是可選的。它通過(guò)參數(shù)InnoDB_doublewrite的值來(lái)控制,如果為0表示不啟用,可以通過(guò)show status like "%InnoDB_dblwr%"來(lái)查看,doublewrite技術(shù)帶給innodb存儲(chǔ)引擎的是數(shù)據(jù)頁(yè)的可靠性,下面對(duì)doublewrite技術(shù)進(jìn)行解析,讓大家充分理解doublewrite是如何做到保障數(shù)據(jù)頁(yè)的可靠性。
一、doublewrite應(yīng)用場(chǎng)景:
我們知道,innodb的數(shù)據(jù)頁(yè)一般大小是16KB,MySQL存取數(shù)據(jù)的最小單位也是頁(yè),而操作系統(tǒng)并不能保障一個(gè)數(shù)據(jù)頁(yè)的原子性,也就是說(shuō)當(dāng)寫(xiě)入數(shù)據(jù)時(shí),有可能在一個(gè)頁(yè)中寫(xiě)入一半時(shí)(比如8K)數(shù)據(jù)庫(kù)宕機(jī),這種情況稱為部分寫(xiě)失效(partial page write),從而導(dǎo)致數(shù)據(jù)丟失。
大家也許會(huì)問(wèn),難道我不可以根據(jù)redo log進(jìn)行數(shù)據(jù)恢復(fù)嗎?答案是肯定的也是否定的,要分為兩種情況:1、數(shù)據(jù)庫(kù)宕機(jī),物理文件完好無(wú)損,是可以通過(guò)redo log進(jìn)行崩潰恢復(fù)。2、數(shù)據(jù)庫(kù)宕機(jī),正在刷新到磁盤(pán)的頁(yè)發(fā)生partial page write,而正好在磁盤(pán)上的這個(gè)數(shù)據(jù)頁(yè)由于宕機(jī)發(fā)生損壞,這時(shí)就無(wú)法通過(guò)redo log進(jìn)行數(shù)據(jù)恢復(fù)了,為什么?我們必須要清楚的認(rèn)識(shí)到,redo log里記錄的是對(duì)頁(yè)的物理操作!比如一條redo記錄"page number xx,偏移量 800 寫(xiě)記錄 “this is abc”",那當(dāng)頁(yè)損壞時(shí),這條redo記錄還有意義嗎?于是在這種特殊情況下,doublewrite就派上用場(chǎng)啦!