日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
突然掉電,為啥MySQL也不會(huì)丟失數(shù)據(jù)?

MySQL采用buffer機(jī)制,避免每次讀寫進(jìn)行磁盤IO,提升效率:

成都創(chuàng)新互聯(lián)公司專注于呼中網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供呼中營銷型網(wǎng)站建設(shè),呼中網(wǎng)站制作、呼中網(wǎng)頁設(shè)計(jì)、呼中網(wǎng)站官網(wǎng)定制、微信小程序開發(fā)服務(wù),打造呼中網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供呼中網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

  • 《??緩沖池(buffer pool??)》
  • 《??寫緩沖(change buffer)??》
  • 《??日志緩沖(log buffer)??》

MySQL的buffer一頁的大小是16K,文件系統(tǒng)一頁的大小是4K,也就是說,MySQL將buffer中一頁數(shù)據(jù)刷入磁盤,要寫4個(gè)文件系統(tǒng)里的頁。

如上圖所示,MySQL里page=1的頁,物理上對(duì)應(yīng)磁盤上的1+2+3+4四個(gè)格。

那么,問題來了,這個(gè)操作并非原子,如果執(zhí)行到一半斷電,會(huì)不會(huì)出現(xiàn)問題呢?

會(huì),這就是所謂的“頁數(shù)據(jù)損壞”。

如上圖所示,MySQL內(nèi)page=1的頁準(zhǔn)備刷入磁盤,才刷了3個(gè)文件系統(tǒng)里的頁,掉電了,則會(huì)出現(xiàn):重啟后,page=1的頁,物理上對(duì)應(yīng)磁盤上的1+2+3+4四個(gè)格,數(shù)據(jù)完整性被破壞。

畫外音:redo無法修復(fù)這類“頁數(shù)據(jù)損壞”的異常,修復(fù)的前提是“頁數(shù)據(jù)正確”并且redo日志正常。

如何解決這類“頁數(shù)據(jù)損壞”的問題呢?

很容易想到的方法是,能有一個(gè)“副本”,對(duì)原來的頁進(jìn)行還原,這個(gè)存儲(chǔ)“副本”的地方,就是Double Write Buffer。

Double Write Buffer,但它與傳統(tǒng)的buffer又不同,它分為內(nèi)存和磁盤的兩層架構(gòu)。

畫外音:傳統(tǒng)的buffer,大部分是內(nèi)存存儲(chǔ);而DWB里的數(shù)據(jù),是需要落地的。

如上圖所示,當(dāng)有頁數(shù)據(jù)要刷盤時(shí):

  • 第一步:頁數(shù)據(jù)先memcopy到DWB的內(nèi)存里;
  • 第二步:DWB的內(nèi)存里,會(huì)先刷到DWB的磁盤上;
  • 第三步:DWB的內(nèi)存里,再刷到數(shù)據(jù)磁盤存儲(chǔ)上;

畫外音:DWB由128個(gè)頁構(gòu)成,容量只有2M。

步驟2和步驟3要寫2次磁盤,這就是“Double Write”的由來。

DWB為什么能解決“頁數(shù)據(jù)損壞”問題呢?

假設(shè)步驟2掉電,磁盤里依然是1+2+3+4的完整數(shù)據(jù)。

畫外音:只要有頁數(shù)據(jù)完整,就能通過redo還原數(shù)據(jù)。

假如步驟3掉電,DWB里存儲(chǔ)著完整的數(shù)據(jù)。

所以,一定不會(huì)出現(xiàn)“頁數(shù)據(jù)損壞”問題。

畫外音:寫了2次,總有一個(gè)地方的數(shù)據(jù)是OK的。

自己實(shí)驗(yàn)了幾十次,仍沒能復(fù)現(xiàn)“頁數(shù)據(jù)損壞”,在網(wǎng)上找了一個(gè)“頁數(shù)據(jù)損壞”時(shí),MySQL重啟過程利用DWB修復(fù)頁數(shù)據(jù)的圖。

可以看到,啟動(dòng)過程中:

  • InnoDB檢測(cè)到上一次為異常關(guān)閉;
  • 嘗試恢復(fù)ibd數(shù)據(jù),失敗;
  • 從DWB中恢復(fù)寫了一半的頁;

能夠通過DWB保證頁數(shù)據(jù)的完整性,但畢竟DWB要寫兩次磁盤,會(huì)不會(huì)導(dǎo)致數(shù)據(jù)庫性能急劇降低呢?

分析DWB執(zhí)行的三個(gè)步驟:

  • 第一步,頁數(shù)據(jù)memcopy到DWB的內(nèi)存,速度很快;
  • 第二步,DWB的內(nèi)存fsync刷到DWB的磁盤,屬于順序追加寫,速度也很快;
  • 第三步,刷磁盤,隨機(jī)寫,本來就需要進(jìn)行,不屬于額外操作;

另外,128頁(每頁16K)2M的DWB,會(huì)分兩次刷入磁盤,每次最多64頁,即1M的數(shù)據(jù),執(zhí)行也是非常之快的。

綜上,性能會(huì)有所影響,但影響并不大。

畫外音:

  • write--ahead-log之所以性能高,就是因?yàn)轫樞蜃芳訉懀?/li>
  • 有第三方測(cè)評(píng),評(píng)估約10%性能損失;

更具體的,InnoDB里有兩個(gè)變量可以查看double write buffer相關(guān)的情況:

  • Innodb_dblwr_pages_written:記錄寫入DWB中頁的數(shù)量。
  • Innodb_dblwr_writes:記錄DWB寫操作的次數(shù)。

可以通過:

show global status like "%dblwr%"

來進(jìn)行查詢。

結(jié)尾

MySQL有很強(qiáng)的數(shù)據(jù)安全性機(jī)制:

  • 在異常崩潰時(shí),如果不出現(xiàn)“頁數(shù)據(jù)損壞”,能夠通過redo恢復(fù)數(shù)據(jù);
  • 在出現(xiàn)“頁數(shù)據(jù)損壞”時(shí),能夠通過double write buffer恢復(fù)頁數(shù)據(jù);

double write buffer:

  • 不是一個(gè)內(nèi)存buffer,是一個(gè)內(nèi)存/磁盤兩層的結(jié)構(gòu),是InnoDB里On-Disk架構(gòu)里很重要的一部分;
  • 是一個(gè)通過寫兩次,保證頁完整性的機(jī)制;

知其然,知其所以然。

思路比結(jié)論重要,希望大家有收獲。


名稱欄目:突然掉電,為啥MySQL也不會(huì)丟失數(shù)據(jù)?
網(wǎng)頁URL:http://www.5511xx.com/article/dhjjoge.html