原创文章,转载请标明原文链接:http://www.cnblogs.com/wingsless/p/5708992.html

昨天写了有关事务日志的一些基本点(http://www.cnblogs.com/wingsless/p/5705314.html),今天结合我最近的学习成果继续总结事务日志的知识点。

三 日志结构

我们都知道InnoDB最小的存储单元叫做页(page)或者块(block),日志系统也是如此,它是一个512字节的块,被这个参数定义:OS_FILE_LOG_BLOCK_SIZE。

一个块肯定不会只有存储数据这么简单,肯定是有头部和尾部写一些信息进去的,而这在代码里很好找:

  1. /* Offsets of a log block header */
  2. #define LOG_BLOCK_HDR_NO 0 /* block number which must be > 0 and
  3. is allowed to wrap around at 2G; the
  4. highest bit is set to if this is the
  5. first log block in a log flush write
  6. segment */
  7. #define LOG_BLOCK_FLUSH_BIT_MASK 0x80000000UL
  8. /* mask used to get the highest bit in
  9. the preceding field */
  10. #define LOG_BLOCK_HDR_DATA_LEN 4 /* number of bytes of log written to
  11. this block */
  12. #define LOG_BLOCK_FIRST_REC_GROUP 6 /* offset of the first start of an
  13. mtr log record group in this log block,
  14. if none; if the value is the same
  15. as LOG_BLOCK_HDR_DATA_LEN, it means
  16. that the first rec group has not yet
  17. been catenated to this log block, but
  18. if it will, it will start at this
  19. offset; an archive recovery can
  20. start parsing the log records starting
  21. from this offset in this log block,
  22. if value not */
  23. #define LOG_BLOCK_CHECKPOINT_NO 8 /* 4 lower bytes of the value of
  24. log_sys->next_checkpoint_no when the
  25. log block was last written to: if the
  26. block has not yet been written full,
  27. this value is only updated before a
  28. log buffer flush */
  29. #define LOG_BLOCK_HDR_SIZE 12 /* size of the log block header in
  30. bytes */
  1. /* Offsets of a log block trailer from the end of the block */
  2. #define LOG_BLOCK_CHECKSUM 4 /* 4 byte checksum of the log block
  3. contents; in InnoDB versions
  4. < 3.23. this did not contain the
  5. checksum but the same value as
  6. .._HDR_NO */
  7. #define LOG_BLOCK_TRL_SIZE 4 /* trailer size in bytes */

画张图:

头部长度是12字节,尾部长度是4字节,代码中标明了头尾的长度,其他的都是偏移量,因此每个部分的长度也就是下一个偏移量减去当前值。这么算下来,实际上能存储数据的部分只有496字节了,这部分网上很多资料里都叫做log data,我在这里也这么叫吧。

头部里我觉得有意思的一个地方是这个:LOG_BLOCK_FIRST_REC_GROUP,这是block里第一个日志的起始位置的偏移量。例如一个日志有500字节,那么写完了一个块之后,还有4个字节会被写在下一个块里,此时又有一个100字节的页写到了第二个block里(起个名字叫log2吧),于是第二个块里变成了这种情况:

第二个日志从16位置开始,到116位置结束,这个时候LOG_BLOCK_FIRST_REC_GROUP值会写什么呢?很显然是16,因为log2才是这个block里的第一个页。

知道了日志结构,其实只是了解redo log的第一步,因为redo log是InnoDB实现事务的重要手段,里面的水很深,我也会不断地把我的学习心得写在这里,并不断地补充写好的东西。

原创文章,转载请标明原文链接:http://www.cnblogs.com/wingsless/p/5708992.html

InnoDB源码分析--事务日志(二)的更多相关文章

  1. InnoDB源码分析--事务日志(一)

    原创文章,转载请注明原文链接(http://www.cnblogs.com/wingsless/p/5705314.html) 在之前的文章<InnoDB的WAL方式学习>(http:// ...

  2. InnoDB源码分析--缓冲池(二)

    转载请附原文链接:http://www.cnblogs.com/wingsless/p/5578727.html 上一篇中我简单的分析了一下InnoDB缓冲池LRU算法的相关源码,其实说不上是分析,应 ...

  3. InnoDB源码分析--缓冲池(三)

    转载请附原文链接:http://www.cnblogs.com/wingsless/p/5582063.html 昨天写到了InnoDB缓冲池的预读:<InnoDB源码分析--缓冲池(二)> ...

  4. 手机自动化测试:appium源码分析之bootstrap二

    手机自动化测试:appium源码分析之bootstrap二   在bootstrap项目中的io.appium.android.bootstrap.handler包中的类都是对应的指令类, priva ...

  5. Thinkphp源码分析系列(二)–引导类

    在上一章我们说到,ThinkPHP.php在设置完框架所需要的变量和调教好环境后,在最后调用了  Think\Think::start();  即Think命名空间中的Think类的静态方法start ...

  6. spring transaction源码分析--事务架构

    1. 引言  事务特性 事务是并发控制的单元,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位.通过事务将逻辑相关的一组操作绑定在一起,以便服务器 保持数据的完整性.事 ...

  7. spark 源码分析之十二 -- Spark内置RPC机制剖析之八Spark RPC总结

    在spark 源码分析之五 -- Spark内置RPC机制剖析之一创建NettyRpcEnv中,剖析了NettyRpcEnv的创建过程. Dispatcher.NettyStreamManager.T ...

  8. Netty源码分析 (十二)----- 心跳服务之 IdleStateHandler 源码分析

    什么是心跳机制? 心跳说的是在客户端和服务端在互相建立ESTABLISH状态的时候,如何通过发送一个最简单的包来保持连接的存活,还有监控另一边服务的可用性等. 心跳包的作用 保活Q:为什么说心跳机制能 ...

  9. Android源码分析(十二)-----Android源码中如何自定义TextView实现滚动效果

    一:如何自定义TextView实现滚动效果 继承TextView基类 重写构造方法 修改isFocused()方法,获取焦点. /* * Copyright (C) 2015 The Android ...

随机推荐

  1. Java中查找文件并且打印输出指定文件下面的子目录

    package com.immoc; import java.io.File; import java.io.IOException; public class FileUtile { //列出fil ...

  2. GJM : 基于Actor模式的c#网络游戏服务器的实现和Unity游戏客户端的连接 [转载]

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

  3. RDBMS架构的开源DW/DSS引擎列表

    因为笔者早期以oracle为主要RDBMS进行设计和优化,所以几乎即使单表超过5000w,多张超过300万以上的表做任意复杂的统计和风控计算都没出过性能问题.如今全面mysql为主线或者说open s ...

  4. javascript模板库jsrender for循环嵌套示例

    最近在参与整合前端的框架,我们知道javascript最强大的模板引擎之一当属jsrender,号称下一代jquery模板引擎的标准实现. 通常在模板merge的过程中,我们会遇到两次乃至三级嵌套的情 ...

  5. jQuery自定义漂亮的下拉框插件8种效果

    jquery美化选择器实例有:边框.下划线. 伸缩 .滑动. 覆盖. 旋转. 弹出层选择 .环形效果. 在线预览 实例代码 <body class="demo-1"> ...

  6. jQuery 制作逼真的日历翻转效果的倒计时

    在开发中,一些功能需要用到倒计时,例如最常见的活动开始.结束的倒计时.使用最流行的 JavaScript 库来制作这个效果很简单.下面就是一个 jQuery 制作的逼真的日历翻转效果的倒计时功能. 在 ...

  7. Electron - 创建跨平台的桌面客户的应用程序

    Electron 框架的前身是 Atom Shell,可以让你写使用 JavaScript,HTML 和 CSS 构建跨平台的桌面应用程序.它是基于io.js 和 Chromium 开源项目,并用于在 ...

  8. Android中的Interpolator

    Android中的Interpolator Interpolator用于动画中的时间插值,其作用就是把0到1的浮点值变化映射到另一个浮点值变化. 本文列出Android API提供的Interpola ...

  9. AndroidAnnotations配置--Android studio

    1.引入对android-apt的依赖.在全局build.gradle中文件中添加以下代码.(Project目录下的build.gradle) repositories { mavenCentral( ...

  10. c语言模拟实现oc引用计数

    #include<stdio.h> #include<stdlib.h> //在c中引入 引用计数机制 // 要解决的问题:  1,指向某块动态内存的指针有几个? //    ...