溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

(轉(zhuǎn))InnoDB之Dirty Page、Redo log

發(fā)布時(shí)間:2020-08-10 12:27:05 來(lái)源:ITPUB博客 閱讀:197 作者:denniswwh 欄目:MySQL數(shù)據(jù)庫(kù)

作者:蘇普 | 【轉(zhuǎn)載時(shí)請(qǐng)務(wù)必以超鏈接形式標(biāo)明文章原始出處和作者信息及本聲明】
地址:http://rdc.taobao.com/blog/dba/html/317_innodb-dirty-page-redo-log.html

在InnoDB中,buffer pool里面的dirty page一方面可以加快數(shù)據(jù)處理速度,同時(shí)也會(huì)造成數(shù)據(jù)的不一致(RAM vs DISK)。本文介紹了dirty page是如何產(chǎn)生,以及InnoDB如何利用redo log如何消除dirty page產(chǎn)生的數(shù)據(jù)不一致。


[@more@]

  1. 當(dāng)事務(wù)(Transaction)需要修改某條記錄(row)時(shí),InnoDB需要將該數(shù)據(jù)所在的page從 disk讀到buffer pool中,事務(wù)提交后,InnoDB修改page中的記錄(row)。這時(shí)buffer pool中的page就已經(jīng)和disk中的不一樣了,我們稱(chēng)buffer pool中的page為dirty page。Dirty page等待flush到disk上。
    (轉(zhuǎn))InnoDB之Dirty Page、Redo log
  2. dirty page既然是在Buffer pool中,那么如果系統(tǒng)突然斷電Dirty page中的數(shù)據(jù)修改是否會(huì)丟失?這個(gè)擔(dān)心是很有必要的,例如如果一個(gè)用戶完成一個(gè)操作(數(shù)據(jù)庫(kù)完成了一個(gè)事務(wù),page已經(jīng)在buffer pool中修改,但dirty page尚未flush),這時(shí)系統(tǒng)斷電,buffer pool數(shù)據(jù)全部消失。那么,這個(gè)用戶完成的操作(導(dǎo)致的數(shù)據(jù)庫(kù)修改)是否會(huì)丟失呢?答案是不會(huì) (innodb_flush_log_at_trx_commit=1)。這就是redo log要做的事情,在disk上記錄更新。
  3. redo log在每次事務(wù)commit的時(shí)候,就立刻將事務(wù)更改操作記錄到redo log。所以即使buffer pool中的dirty page在斷電時(shí)丟失,InnoDB在啟動(dòng)時(shí),仍然會(huì)根據(jù)redo log中的記錄完成數(shù)據(jù)恢復(fù)。
  4. redo log的另一個(gè)作用是,通過(guò)延遲dirty page的flush最小化磁盤(pán)的random writes。(redo log會(huì)合并一段時(shí)間內(nèi)TRX對(duì)某個(gè)page的修改)
    (轉(zhuǎn))InnoDB之Dirty Page、Redo log
  5. 正常情況下,dirty page什么時(shí)候flush到disk上?
    1).redo log是一個(gè)環(huán)(ring)結(jié)構(gòu),當(dāng)redo空間占滿時(shí),將會(huì)將部分dirty page flush到disk上,然后釋放部分redo log。這種情況可以通過(guò)Innodb_log_wait(SHOW GLOBAL STATUS)觀察,情況發(fā)生該計(jì)數(shù)器會(huì)自增一次。
    2). 當(dāng)需要在Buffer pool分配一個(gè)page,但是已經(jīng)滿了,并且所有的page都是dirty的(否則可以釋放不dirty的page),通常是不會(huì)發(fā)生的。這時(shí)候必須 flush dirty pages to disk。這種情況將會(huì)記錄到Innodb_buffer_pool_wait_free中。一般地,可以可以通過(guò)啟動(dòng)參數(shù) innodb_max_dirty_pages_pct控制這種情況,當(dāng)buffer pool中的dirty page到達(dá)這個(gè)比例的時(shí)候,將會(huì)強(qiáng)制設(shè)定一個(gè)checkpoint,并把dirty page flush到disk中。
    3).檢測(cè)到系統(tǒng)空閑的時(shí)候,會(huì)flush,每次64 pages。
  6. 涉及的InnoDB配置參數(shù):innodb_flush_log_at_trx_commit、innodb_max_dirty_pages_pct;狀態(tài)參數(shù):Innodb_log_wait、Innodb_buffer_pool_wait_free。

參考文獻(xiàn)

  1. http://mysqldump.azundris.com/archives/78-Configuring-InnoDB-An-InnoDB-tutorial.html
  2. http://dev.mysql.com/doc/refman/5.0/en/innodb.html
向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI