在之前的文章《innodb的wal方式學習》(裡,我分析了wal是什麼,觸發時機,最近剛好在看redo log方面的原始碼,就再次聊一聊這方面的事情吧。
大家都知道這個引數:innodb_flush_log_at_trx_commit,該引數用於控制redo buffer中的內容寫入日誌的時機,一般來說分為兩個部分:redo buffer寫入log file;os cache/buffer刷入磁碟。我畫了乙個簡單的示意圖:
畫完這個圖我有了一點困惑,因為還有乙個引數:innodb_flush_method,我們平時選的都是o_direct。這個引數和上面的引數是怎麼樣的乙個關係,從引數上直接看好像這個引數是規定如何flush的,如果這樣的話,上面那張圖會變成什麼樣子?
於是我借了一本講linux核心的書,從這本書我大概知道o_direct是一種檔案的開啟方式,即程序直接獲取檔案內容,不需要經過系統快取這一步。然後我又翻看了mysql的相關文件,文件中明確的告訴了我使用了o_direct之後,資料檔案會以o_direct方式開啟,但是還是要用fsync()函式把資料和log刷回磁碟。實際上我覺得這個引數的名字有些問題,這個引數真的不是只規定了flush的方法,還包括了檔案開啟的方法。於是可以畫這樣一張圖:
這就成了上面那張圖的補充版。
innodb還是很好玩的,最近在整理原始碼的學習筆記,事務日誌這裡還是值得寫一些東西的,了解了這些基本的知識背景之後再看原始碼也就不是很痛苦了。
innodb事務日誌
mysql會最大程度的使用快取機制來提高資料庫的訪問效率,但是萬一資料庫發生斷電,因為快取的資料沒有寫入磁碟,導致快取在記憶體中的資料丟失而導致資料不一致怎麼辦?innodb主要是通過事務日誌實現acid特性 事務日誌包括 重做日誌redo和回滾日誌undo redo記錄的是已經全部完成的事務,就是...
innoDB原始碼分析 緩衝池
最開始學oracle的時候,有個概念叫sga和pga,是非常重要的概念,其實就是記憶體中的緩衝池。innodb的設計類似於oracle,也會在記憶體中開闢一片緩衝池。眾所周知,cpu的速度和磁碟的io速度相差可以用鴻溝來形容,因此聰明的前輩們使用了記憶體這個rom來彌補這道鴻溝,那麼資料庫的設計者們...
InnoDB原始碼分析 緩衝池(三)
昨天寫到了innodb緩衝池的預讀 innodb原始碼分析 緩衝池 二 最後因為著急看歐洲盃,沒有把線性預讀寫完,今天接著寫。線性預讀是由這個函式實現的 buf read ahead linear,和隨機預讀一樣,首先是要確定區域邊界,這個邊界內被訪問過的page如果達到乙個閾值 buf read ...