原創文章,轉載請註明原文連接(http://www.cnblogs.com/wingsless/p/5705314.html)html
在以前的文章《InnoDB的WAL方式學習》(http://www.cnblogs.com/wingsless/p/5203064.html)裏,我分析了WAL是什麼,觸發時機,最近恰好在看redo log方面的源碼,就再次聊一聊這方面的事情吧。緩存
你們都知道這個參數:innodb_flush_log_at_trx_commit,該參數用於控制redo buffer中的內容寫入日誌的時機,通常來講分爲兩個部分:redo buffer寫入log file;OS cache/buffer刷入磁盤。我畫了一個簡單的示意圖:less
畫完這個圖我有了一點困惑,由於還有一個參數:innodb_flush_method,咱們平時選的都是O_DIRECT。這個參數和上面的參數是怎麼樣的一個關係,從參數上直接看好像這個參數是規定如何flush的,若是這樣的話,上面那張圖會變成什麼樣子?函數
因而我借了一本講Linux內核的書,從這本書我大概知道O_DIRECT是一種文件的打開方式,即進程直接獲取文件內容,不須要通過系統緩存這一步。而後我又翻看了MySQL的相關文檔,文檔中明確的告訴了我使用了O_DIRECT以後,數據文件會以O_DIRECT方式打開,可是仍是要用fsync()函數把數據和log刷回磁盤。實際上我以爲這個參數的名字有些問題,這個參數真的不是隻規定了flush的方法,還包括了文件打開的方法。因而能夠畫這樣一張圖:學習
這就成了上面那張圖的補充版。日誌
InnoDB仍是很好玩的,最近在整理源碼的學習筆記,事務日誌這裏仍是值得寫一些東西的,瞭解了這些基本的知識背景以後再看源碼也就不是很痛苦了。htm
原創文章,轉載請註明原文連接(http://www.cnblogs.com/wingsless/p/5705314.html)blog