原創文章,轉載請注明原文鏈接(http://www.cnblogs.com/wingsless/p/5705314.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刷入磁盤。我畫了一個簡單的示意圖:
畫完這個圖我有了一點困惑,因為還有一個參數:innodb_flush_method,我們平時選的都是O_DIRECT。這個參數和上面的參數是怎麼樣的一個關系,從參數上直接看好像這個參數是規定如何flush的,如果這樣的話,上面那張圖會變成什麼樣子?
於是我借了一本講Linux內核的書,從這本書我大概知道O_DIRECT是一種文件的打開方式,即進程直接獲取文件內容,不需要經過系統緩存這一步。然後我又翻看了MySQL的相關文檔,文檔中明確的告訴了我使用了O_DIRECT之後,數據文件會以O_DIRECT方式打開,但是還是要用fsync()函數把數據和log刷回磁盤。實際上我覺得這個參數的名字有些問題,這個參數真的不是只規定了flush的方法,還包括了文件打開的方法。於是可以畫這樣一張圖:
這就成了上面那張圖的補充版。
InnoDB還是很好玩的,最近在整理源碼的學習筆記,事務日志這裡還是值得寫一些東西的,了解了這些基本的知識背景之後再看源碼也就不是很痛苦了。
原創文章,轉載請注明原文鏈接(http://www.cnblogs.com/wingsless/p/5705314.html)