zoukankan      html  css  js  c++  java
  • 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)

  • 相关阅读:
    qt 数据库操作总结
    Pro*C编程研究一:从.pc到.exe
    通过OCCI连接oracle(C++)
    数据库操作通用类
    一个数据库操作类,适用于Oracle,ACCESS,SQLSERVER
    如何卸载oracle11g
    ORA-12541:TNS:无监听程序
    Qt 线程基础(QThread、QtConcurrent等) 2
    QThreadPool类和QtConcurrent命名空间
    AE 向已存在的要素类中添加字段
  • 原文地址:https://www.cnblogs.com/wingsless/p/5705314.html
Copyright © 2011-2022 走看看