作者:蘇普 | 【轉載時請務必以超鏈接形式標明文章原始出處和作者信息及本聲明】
地址:http://rdc.taobao.com/blog/dba/html/317_innodb-dirty-page-redo-log.html
創新互聯建站科技有限公司專業互聯網基礎服務商,為您提供
達州服務器托管,
高防服務器租用,成都IDC機房托管,成都主機托管等互聯網服務。
在InnoDB中,buffer pool里面的dirty page一方面可以加快數據處理速度,同時也會造成數據的不一致(RAM vs
DISK)。本文介紹了dirty page是如何產生,以及InnoDB如何利用redo log如何消除dirty page產生的數據不一致。
[@more@]
- 當事務(Transaction)需要修改某條記錄(row)時,InnoDB需要將該數據所在的page從
disk讀到buffer pool中,事務提交后,InnoDB修改page中的記錄(row)。這時buffer
pool中的page就已經和disk中的不一樣了,我們稱buffer pool中的page為dirty page。Dirty
page等待flush到disk上。
- dirty page既然是在Buffer pool中,那么如果系統突然斷電Dirty
page中的數據修改是否會丟失?這個擔心是很有必要的,例如如果一個用戶完成一個操作(數據庫完成了一個事務,page已經在buffer
pool中修改,但dirty page尚未flush),這時系統斷電,buffer
pool數據全部消失。那么,這個用戶完成的操作(導致的數據庫修改)是否會丟失呢?答案是不會
(innodb_flush_log_at_trx_commit=1)。這就是redo log要做的事情,在disk上記錄更新。
- redo log在每次事務commit的時候,就立刻將事務更改操作記錄到redo log。所以即使buffer pool中的dirty page在斷電時丟失,InnoDB在啟動時,仍然會根據redo log中的記錄完成數據恢復。
- redo log的另一個作用是,通過延遲dirty page的flush最小化磁盤的random writes。(redo log會合并一段時間內TRX對某個page的修改)
- 正常情況下,dirty page什么時候flush到disk上?
1).redo
log是一個環(ring)結構,當redo空間占滿時,將會將部分dirty page flush到disk上,然后釋放部分redo
log。這種情況可以通過Innodb_log_wait(SHOW GLOBAL STATUS)觀察,情況發生該計數器會自增一次。
2).
當需要在Buffer
pool分配一個page,但是已經滿了,并且所有的page都是dirty的(否則可以釋放不dirty的page),通常是不會發生的。這時候必須
flush dirty pages to
disk。這種情況將會記錄到Innodb_buffer_pool_wait_free中。一般地,可以可以通過啟動參數
innodb_max_dirty_pages_pct控制這種情況,當buffer pool中的dirty
page到達這個比例的時候,將會強制設定一個checkpoint,并把dirty page flush到disk中。
3).檢測到系統空閑的時候,會flush,每次64 pages。 - 涉及的InnoDB配置參數:innodb_flush_log_at_trx_commit、innodb_max_dirty_pages_pct;狀態參數:Innodb_log_wait、Innodb_buffer_pool_wait_free。
參考文獻
- http://mysqldump.azundris.com/archives/78-Configuring-InnoDB-An-InnoDB-tutorial.html
- http://dev.mysql.com/doc/refman/5.0/en/innodb.html
分享標題:(轉)InnoDB之DirtyPage、Redolog-創新互聯
分享URL:http://m.newbst.com/article32/dpgopc.html
成都網站建設公司_創新互聯,為您提供網站改版、企業建站、用戶體驗、定制開發、域名注冊、云服務器
廣告
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源:
創新互聯