原创文章,转载请注明原文连接(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