程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> InnoDB源碼分析--事務日志(一),innodb源碼

InnoDB源碼分析--事務日志(一),innodb源碼

編輯:MySQL綜合教程

InnoDB源碼分析--事務日志(一),innodb源碼


     原創文章,轉載請注明原文鏈接(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內核的一些鬼  

       於是我借了一本講Linux內核的書,從這本書我大概知道O_DIRECT是一種文件的打開方式,即進程直接獲取文件內容,不需要經過系統緩存這一步。然後我又翻看了MySQL的相關文檔,文檔中明確的告訴了我使用了O_DIRECT之後,數據文件會以O_DIRECT方式打開,但是還是要用fsync()函數把數據和log刷回磁盤。實際上我覺得這個參數的名字有些問題,這個參數真的不是只規定了flush的方法,還包括了文件打開的方法。於是可以畫這樣一張圖:

        

        這就成了上面那張圖的補充版。

        InnoDB還是很好玩的,最近在整理源碼的學習筆記,事務日志這裡還是值得寫一些東西的,了解了這些基本的知識背景之後再看源碼也就不是很痛苦了。

        原創文章,轉載請注明原文鏈接(http://www.cnblogs.com/wingsless/p/5705314.html)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved