十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
小編給大家分享一下mysql innodb double write概念是什么,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
double write原理圖如下:
通過(guò)引入doublewrite buffer的方案,每次innodb在準(zhǔn)備寫(xiě)出一個(gè)page時(shí),先把page寫(xiě)到doublewrite buffer中.如果在寫(xiě)doublewrite buffer時(shí),發(fā)生了意外,但是數(shù)據(jù)文件中的原來(lái)的page不受影響,這樣在下次啟動(dòng)時(shí),可以通過(guò)innodb的redolog進(jìn)行恢復(fù).如果在寫(xiě)doublewrite buffer成功后,mysql會(huì)把doublewrite buffer的內(nèi)容寫(xiě)到數(shù)據(jù)文件中,如果在這個(gè)過(guò)程又出現(xiàn)了
意外,沒(méi)有關(guān)系,重啟后mysql可以通過(guò)從doublewrite buffer找到好的page,再用該好的page去覆蓋磁盤(pán)上壞的page即可。
所以在正常的情況下,mysql寫(xiě)數(shù)據(jù)page時(shí),會(huì)寫(xiě)兩遍到磁盤(pán)上,第一遍是寫(xiě)到doublewrite buffer,第二遍是從doublewrite buffer寫(xiě)到真正的數(shù)據(jù)文件中.
為了解決 partial page write問(wèn)題 ,當(dāng)mysql將臟數(shù)據(jù)flush到data file的時(shí)候,先使用memcopy將臟數(shù)據(jù)復(fù)制到內(nèi)存中的double write buffer,通過(guò)double write buffer再分2次,每次寫(xiě)入1MB到共享表空間,然后馬上調(diào)用fsync函數(shù),同步到磁盤(pán)上,避免緩沖帶來(lái)的問(wèn)題。
兩次寫(xiě)需要額外添加兩個(gè)部分:
1)內(nèi)存中的兩次寫(xiě)緩沖(doublewrite buffer),大小為2MB
2)磁盤(pán)上共享表空間中連續(xù)的128頁(yè),大小也為2MB。其中120個(gè)用于批量寫(xiě)臟頁(yè),另外8個(gè)用于Single Page Flush。做區(qū)分的原因是批量刷臟是后臺(tái)線程做的,不影響前臺(tái)線程。而Single page flush是用戶線程發(fā)起的,需要盡快的刷臟頁(yè)并替換出一個(gè)空閑頁(yè)出來(lái)。
相關(guān)參數(shù)解釋:
(root@localhost)-[11:35:25]-[(none)]>show status like "%InnoDB_dblwr%";
+----------------------------+-----------+
| Variable_name | Value |
+----------------------------+-----------+
| Innodb_dblwr_pages_written | 882384812 |
| Innodb_dblwr_writes | 61236457 |
+----------------------------+-----------+
2 rows in set (0.01 sec)
InnoDB_dblwr_pages_written doublewrite寫(xiě)的頁(yè)的總數(shù)
InnoDB_dblwr_writes doublewrite寫(xiě)的文件的次數(shù)
因?yàn)榕K頁(yè)刷新到磁盤(pán)的寫(xiě)入單元小于單個(gè)頁(yè)的大小,如果在寫(xiě)入過(guò)程中數(shù)據(jù)庫(kù)突然宕機(jī),可能會(huì)使數(shù)據(jù)頁(yè)的寫(xiě)入不完成,
造成數(shù)據(jù)頁(yè)的損壞。而redo log中記錄的是對(duì)頁(yè)的物理操作,如果數(shù)據(jù)頁(yè)損壞了,通過(guò)redo log也無(wú)法進(jìn)行恢復(fù)。
所以為了保證數(shù)據(jù)頁(yè)的寫(xiě)入安全,引入了double write。double write的實(shí)現(xiàn)分兩個(gè)部分,一個(gè)是緩沖池中2M的內(nèi)存塊
大小,一個(gè)是共享表空間中連續(xù)的128個(gè)頁(yè),大小是2M。臟頁(yè)從flush list刷新時(shí),并不是直接刷新到磁盤(pán)而是先調(diào)用
函數(shù)(memcpy),將臟頁(yè)拷貝到double write buffer中,然后再分兩次,每次1M將double write buffer 刷新到
磁盤(pán)double write 區(qū),之后再調(diào)用fsync操作,同步到磁盤(pán)。
如果是寫(xiě)doublewrite buffer本身失敗,那么這些數(shù)據(jù)不會(huì)被寫(xiě)到磁盤(pán),innodb此時(shí)會(huì)從磁盤(pán)載入原始的數(shù)據(jù),然后通過(guò)innodb的事務(wù)日志來(lái)計(jì)算出正確的數(shù)據(jù),重新 寫(xiě)入到doublewrite buffer。
如果應(yīng)用在業(yè)務(wù)高峰期,innodb_dblwr_pages_written:innodb_dblwr_writes遠(yuǎn)小于64:1,則說(shuō)明,系統(tǒng)寫(xiě)入壓力不大。
雖然,double write buffer刷新到磁盤(pán)的時(shí)候是順序?qū)?,但還是是有性能損耗的。
如果系統(tǒng)本身支持頁(yè)的安全性保障(部分寫(xiě)失效防范機(jī)制),如ZFS,那么就可以禁用掉該特性(skip_innodb_doublewrite)。
看完了這篇文章,相信你對(duì)“mysql innodb double write概念是什么”有了一定的了解,如果想了解更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道,感謝各位的閱讀!