熟悉MySQL的人,都知道InnoDB存儲引擎,如大家所知,Redo Log是innodb的核心事務日志之一,innodb寫入Redo Log后就會提交事務,而非寫入到Datafile。之后innodb再異步地將新事務的數據異步地寫入Datafile,真正存儲起來。
那么innodb引擎有了redo log和buffer pool以后,為什么能夠在提升性能的同時,還能保證不丟數據呢? Buffer Pool, Redo Log以及Datafile之間的具體關系是什么呢。
另外Innodb還有一大堆概念,Dirty Page, LRU, LSN,Checkpoint等等,這些概念在Innodb里是什么運作的呢?
下面通過一張圖來告訴大家
Buffer Pool, Redo Log以及Datafile的關系
Innodb的原理
大家可以把innodb的事務寫入過程看成寫作一篇文章的過程。Innodb的寫入過程其實和我們寫作的過程是非常類似的。
試想,領導讓我們寫一篇文章,發表在論壇上。然后我們想到了一個絕佳的點子,並決定要放到文章里,可是手上還有其他事情,一時半會兒寫不完,又擔心過后忘了,領導還等着我們答復,此時我們會怎么做呢?我們一定會先大概構思個提綱,並把提綱和一些關鍵細節記錄到本子上,作為草稿,然后立刻告訴領導自己要寫什么東西,讓其確認。最后等晚上有時間了,再根據草稿去斟詞酌句,編寫正稿。
在這個過程中,我們用到的幾個關鍵的東西:
我們的大腦,用來臨時暫時記住我們的點子
草稿,我們需要草稿來保證不會把點子和關鍵的細節給忘了
正稿,這是我們最終要輸出的東西
有了這幾個東西,我們不僅能確保我們不會錯過一篇漂亮的文章,還能快速告訴領導自己一定可以搞定這件事情。
Innodb實際上也用到了這幾個關鍵的東西:
Buffer Pool:就是我們的大腦
事務日志:就是我們的草稿
Datafile:就是我們的正稿
只要按照之前寫文章的過程,來進行整個事務的寫入操作,不僅能保證不丟失數據,而且能夠快速響應。
一次寫入操作是一次事務,innodb首先把事務數據寫入到Buffer Pool和事務日志中,也就是在大腦中記憶下來,並寫下草稿。然后就可以提交事務,響應客戶端了。之后innodb在“有時間的時候”,異步地把這次寫入的數據從Buffer Pool,或者事務日志中正式地寫入到Datafile中,形成“正稿”。
其中,innodb為了保證事務日志這個“草稿”一定能無損地還原成正稿,還不能占用太多空間,事務日志需要有以下特點:
事務日志中一定保存了要寫入的所有數據內容
事務日志只會把新事務追加在日志最后,而不會去修改之前的內容
一旦事務數據被寫到datafile,事務日志中的“草稿”就可以刪除了
通過上面3個特點我們可以看出,在形成“正稿”之前,“草稿”是不會被刪除的;同時,“草稿”的空間是可以被循環利用的;最后,只要“草稿”在,我們一定能寫出“正稿”。
這里還需要說明的,是Recovery流程。也就是如果在形成“正稿”前,數據庫Crash了,我們需要重啟整個進程,服務器,甚至只能把數據復制到另外一台服務器來進行恢復。這個時候,事務日志這個“草稿”就發揮了它最大的作用——數據恢復。這也和我們在工作生活中常出現的問題——把事情忘了——非常類似。
Buffer Pool本質就是存儲於內存中的一個數據結構,內存和人的大腦一樣,是“健忘”的。數據庫Crash時,Buffer Pool中的數據極大可能“灰飛煙滅”了。因此,事務日志就如我們貼心的“記事本”,它把我們的記憶,保存為“草稿”,當我們忘了的時候,就可以翻開,把記憶重新回想起來。
LSN和Checkpoint
上面介紹了一次寫入事務的情況,而數據庫在使用過程中,事務都是連續不斷,根據上面所述innodb邏輯,寫“草稿”和寫“正稿”速度和進度絕大部分情況下是不一樣的。
再繼續上面“寫作文章”例子,如果我們的文章很長,一天寫不完,而白天都有其他工作,我們只能記錄草稿,只有晚上回去才能繼續寫正稿。那么我們就面臨一個問題:我們昨天寫到哪了。
最常見的辦法就是,每天晚上去對照一下草稿的內容和正稿的內容,以此來判斷寫到哪了,但這比較花時間,因為正稿中可能包含了很多華麗的語句,我們需要思考一下才能對比上內容。
另外一個更簡單的辦法,就是每天晚上寫完正稿后,我們在草稿上做個標記,標記下最后一條被寫為正稿的內容,這樣第二天晚上,我們就可以從這個標記的后面一條開始,繼續寫我們的正稿,而不需要去對比內容。
顯然第二個方法效率更高,而且沒有什么額外的風險。因此innodb就使用了這個辦法。LSN是草稿上每一條記錄的編號,我們每天晚上標記下最后一條寫到正稿的記錄編號,這個標記的編號,就是Checkpoint。Innodb根據這個checkpoint,就可以很快知道上次回放到哪里,同時也可以把這個編號之前的草稿,全部刪掉了。
轉載原文:http://www.360doc.com/content/18/0523/10/45882429_756316759.shtml