2019独角兽企业重金招聘Python工程师标准>>>

1、事务日志介绍   
      参照mysql5.5的中文说明;
        Innodb的事务日志是指Redo log,简称Log,保存在日志文件ib_logfile*里面。Innodb还有另外一个日志Undo log,但Undo log是存放在共享表空间里面的(ibdata*文件)。

由于Log和Checkpoint紧密相关,因此将这两部分合在一起分析。

名词解释:LSN(log  serial  number),日志序列号,Innodb的日志序列号是一个64位的整型
         1.1log的写入机制:

LSN实际上对应日志文件的偏移量,新的LSN=旧的LSN + 写入的日志大小。举例如下:

LSN=1G,日志文件大小总共为600M,本次写入512字节,则实际写入操作为:

l 求出偏移量:由于LSN数值远大于日志文件大小,因此通过取余方式,得到偏移量为400M;

l 写入日志:找到偏移400M的位置,写入512字节日志内容,下一个事务的LSN就是1000000512;
 1.2Checkpoint写入
Innodb实现了Fuzzy Checkpoint的机制,每次取到最老的脏页,然后确保此脏页对应的LSN之前的LSN都已经写入日志文件,再将此脏页的LSN作为Checkpoint点记录到日志文件,意思就是“此LSN之前的LSN对应的日志和数据都已经写入磁盘文件”。恢复数据文件的时候,Innodb扫描日志文件,当发现LSN小于Checkpoint对应的LSN,就认为恢复已经完成。
Checkpoint写入的位置在日志文件开头固定的偏移量处,即每次写Checkpoint都覆盖之前的Checkpoint信息。
1.3管理机制
由于Checkpoint和日志紧密相关,将日志和Checkpoint一起说明,详细的实现机制如下
 

如上图所示,Innodb的一条事务日志共经历4个阶段:

l 创建阶段:事务创建一条日志;

l 日志刷盘:日志写入到磁盘上的日志文件;

l 数据刷盘:日志对应的脏页数据写入到磁盘上的数据文件;

l 写CKP:日志被当作Checkpoint写入日志文件;

对应这4个阶段,系统记录了4个日志相关的信息,用于其它各种处理使用:

l Log sequence number(LSN1):当前系统LSN最大值,新的事务日志LSN将在此基础上生成(LSN1+新日志的大小);

l Log flushed up to(LSN2):当前已经写入日志文件的LSN;

l Oldest modified data log(LSN3):当前最旧的脏页数据对应的LSN,写Checkpoint的时候直接将此LSN写入到日志文件;

l Last checkpoint at(LSN4):当前已经写入Checkpoint的LSN;

对于系统来说,以上4个LSN是递减的,即: LSN1>=LSN2>=LSN3>=LSN4.创建日志的LSN最大,写入checkpoint的lsn是最小的;
        show  engine  innodb  status  \G;
        ---
        LOG
        ---
        Log sequence number 16953660229
        Log flushed up to   16953660229
        Last checkpoint at  16953652205

1.4保护机制
 
      Innodb的数据并不是实时写盘的,为了避免宕机时数据丢失,保证数据的ACID属性,Innodb至少要保证数据对应的日志不能丢失。对于不同的情况,Innodb采取不同的对策:
     宕机导致日志丢失
     Innodb有日志刷盘机制,可以通过innodb_flush_log_at_trx_commit参数进行控制;
     日志覆盖导致日志丢失
     Innodb日志文件大小是固定的,写入的时候通过取余来计算偏移量,这样存在两个LSN写入到同一位置的可能,后面写的把前面写得就覆盖了,以“写入机制”章节的样例为例,LSN=100000000和LSN=1600000000两个日志的偏移量是相同的了。这种情况下,为了保证数据一致性,必须要求LSN=1000000000对应的脏页数据都已经刷到磁盘中,也就是要求Last checkpoint对应的LSN一定要大于1000000000,否则覆盖后日志也没有了,数据也没有刷盘,一旦宕机,数据就丢失了。
     为了解决第二种情况导致数据丢失的问题,Innodb实现了一套日志保护机制,详细实现如下:
     
 
  上图中,直线代表日志空间(Log cap,约等于日志文件总大小*0.8,0.8是一个安全系数),Ckp age和Buf age是两个浮动的点,Buf async、Buf sync、Ckp async、Ckp sync是几个固定的点。各个概念的含义如下:

当事务执行速度大于脏页刷盘速度时,Ckp age和Buf age会逐步增长,当达到async点的时候,强制进行脏页刷盘或者写Checkpoint,如果这样做还是赶不上事务执行的速度,则为了避免数据丢失,到达sync点的时候,会阻塞其它所有的事务,专门进行脏页刷盘或者写Checkpoint。
因此从理论上来说,只要事务执行速度大于脏页刷盘速度,最终都会触发日志保护机制,进而将事务阻塞,导致MySQL操作挂起。

由于写Checkpoint本身的操作相比写脏页要简单,耗费时间也要少得多,且Ckp sync点在Buf sync点之后,因此绝大部分的阻塞都是阻塞在了Buf sync点,这也是当事务阻塞的时候,IO很高的原因,因为这个时候在不断的刷脏页数据到磁盘。例如如下截图的日志显示了很多事务阻塞在了Buf sync点:
参考资料:linux公社谋篇文章

转载于:https://my.oschina.net/u/2350399/blog/713827

mysql-innodb 日志机制分析----写在死锁前面相关推荐

  1. 转帖-MySQL Innodb日志机制深入分析

    为什么80%的码农都做不了架构师?>>>    MySQL Innodb日志机制深入分析 http://blog.csdn.net/yunhua_lee/article/detail ...

  2. MySQL Innodb日志机制深入分析

    1.1. Log & Checkpoint Innodb的事务日志是指Redo log,简称Log,保存在日志文件ib_logfile*里面.Innodb还有另外一个日志Undo log,但U ...

  3. 面试必备,MySQL InnoDB MVCC机制

    MySQL InnoDB MVCC机制吐血总结 谈到MySQL事务,必然离不开InnoDB和MVCC机制,同时,MVCC也是数据库面试中的杀手问题,写这篇总结的目的,就是为了让自己加深映像,这样面试就 ...

  4. [转载] 数据库分析手记 —— InnoDB锁机制分析

    作者:倪煜 InnoDB锁机制常常困扰大家,不同的条件下往往表现出不同的锁竞争,在实际工作中经常要分析各种锁超时.死锁的问题.本文通过不同条件下的实验,利用InnoDB系统给出的各种信息,分析了锁的工 ...

  5. MySQL InnoDB锁机制全面解析分享

    写在前面:在设计新零售供应链wms(仓库管理系统)库存模块时,为了防止并发情况对库存的影响,查阅了一些资料,对InnoDB锁机制有了更全面的了解,在此做出分享,如有疏漏望不吝指正,愿共同进步!(此篇为 ...

  6. mysql InnoDB 行锁分析

    我们知道 mysql innodb 在插入更新数据时是锁行的,但这里所指的行并不是直面上说的单行,而是相对的范围的行! 引起我关注这个问题的是在做天气预报查询15天(http://tqybw.net) ...

  7. MySQL InnoDB MVCC机制吐血总结

    原文:https://www.jianshu.com/p/d67f0329d3bf 谈到MySQL事务,必然离不开InnoDB和MVCC机制,同时,MVCC也是数据库面试中的杀手问题,写这篇总结的目的 ...

  8. 【169期】面试官:同学,分析一下MySQL/InnoDB的加锁过程吧

    程序员的成长之路 互联网/程序员/技术/资料共享 关注 阅读本文大概需要 17 分钟. 来自:cnblogs.com/crazylqy/p/7611069.html Hello,大家好,我是良月柒. ...

  9. 何登成对Innodb加锁的分析

    背景 MySQL/InnoDB的加锁分析,一直是一个比较困难的话题.我在工作过程中,经常会有同事咨询这方面的问题.同时,微博上也经常会收到MySQL锁相关的私信,让我帮助解决一些死锁的问题.本文,准备 ...

最新文章

  1. Linux下使用ssh密钥实现无交互备份
  2. 1147 Heaps (30 分)【难度: 一般 / 知识点: 堆 模拟 】
  3. 【PM模块】预防性维护(上)
  4. linux内核2018,CVE-2018-1000001 linux kernel
  5. 收藏 | 49 个 Python 学习资源
  6. 1012 数字分类 (20 分)(c语言)
  7. 如何设置XMind思维导图线条
  8. mysql系统搭建互备DB(双主)记录
  9. $(document).ready和window.onload的区别
  10. 带着canvas去流浪系列之五 绘制K线图
  11. httpd配置文件详解(上)
  12. Delphi的MessageBox对话框使用
  13. python基础教程第三版-Python基础教程(第三版)(七)再谈抽象
  14. redis 删除key的命令_面试官问:Redis变慢了,你会怎么排查?
  15. 数学建模学习交流论文写作课件
  16. 让程序最小化到任务栏的时候隐藏
  17. linux 锐捷客户端 脚本,基于802.1x的锐捷linux客户端
  18. 架构蓝图--软件架构 “4+1“ 视图模型
  19. python基础案例教程课后答案_Python基础案例教程
  20. 最小公倍数c语言N-S图,最小公倍数n-s图

热门文章

  1. Hibernate的increment主键生成机制带来的问题
  2. 淘宝2011.9.21校园招聘会笔试题+答案
  3. web项目数据存入mysql数据库中文乱码问题
  4. 如何去掉系统快捷方式的箭头(转载)
  5. 应用程序异常管理组件 Example 程序
  6. Nginx如何实现支持HTTPS协议详细说明
  7. 或许有一两点你不知的C语言特性
  8. UBUNTU添加开机自动启动程序方法
  9. 防火墙(二)SNAT和DNAT
  10. js 函数调用顺序研究