`
suoyihen
  • 浏览: 1360477 次
文章分类
社区版块
存档分类
最新评论

MySQL Innodb日志机制深入分析

 
阅读更多

MySQL Innodb日志机制深入分析

1.1.Log&Checkpoint

Innodb的事务日志是指Redolog,简称Log,保存在日志文件ib_logfile*里面。Innodb还有另外一个日志Undo log,但Undo log是存放在共享表空间里面的(ibdata*文件)。

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

名词解释:LSN,日志序列号,Innodb的日志序列号是一个64位的整型。

1.1.1.写入机制

1.1.1.1.Log写入

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

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

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

l写入日志:找到偏移400M的位置,写入512字节日志内容,下一个事务的LSN就是1000000512

1.1.1.2.Checkpoint写入

Innodb实现了FuzzyCheckpoint的机制,每次取到最老的脏页,然后确保此脏页对应的LSN之前的LSN都已经写入日志文件,再将此脏页的LSN作为Checkpoint点记录到日志文件,意思就是“LSN之前的LSN对应的日志和数据都已经写入磁盘文件”。恢复数据文件的时候,Innodb扫描日志文件,当发现LSN小于Checkpoint对应的LSN,就认为恢复已经完成。

Checkpoint写入的位置在日志文件开头固定的偏移量处,即每次写Checkpoint都覆盖之前的Checkpoint信息。

1.1.2.管理机制

由于Checkpoint和日志紧密相关,将日志和Checkpoint一起说明,详细的实现机制如下:

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

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

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

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

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

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

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

lLogflusheduptoLSN2):当前已经写入日志文件的LSN

lOldestmodifieddatalogLSN3):当前最旧的脏页数据对应的LSN,写Checkpoint的时候直接将此LSN写入到日志文件;

lLastcheckpointatLSN4):当前已经写入CheckpointLSN

对于系统来说,以上4LSN是递减的,即:LSN1>=LSN2>=LSN3>=LSN4.

具体的样例如下(使用showinnodbstatus/G命令查看,Oldestmodifieddatalog没有显示):

1.1.3.保护机制

Innodb的数据并不是实时写盘的,为了避免宕机时数据丢失,保证数据的ACID属性,Innodb至少要保证数据对应的日志不能丢失。对于不同的情况,Innodb采取不同的对策:

l宕机导致日志丢失
Innodb有日志刷盘机制,可以通过innodb_flush_log_at_trx_commit参数进行控制;

l日志覆盖导致日志丢失

Innodb日志文件大小是固定的,写入的时候通过取余来计算偏移量,这样存在两个LSN写入到同一位置的可能,后面写的把前面写得就覆盖了,以“写入机制”章节的样例为例,LSN100000000LSN1600000000两个日志的偏移量是相同的了。这种情况下,为了保证数据一致性,必须要求LSN=1000000000对应的脏页数据都已经刷到磁盘中,也就是要求Lastcheckpoint对应的LSN一定要大于1000000000,否则覆盖后日志也没有了,数据也没有刷盘,一旦宕机,数据就丢失了。

为了解决第二种情况导致数据丢失的问题,Innodb实现了一套日志保护机制,详细实现如下:

上图中,直线代表日志空间(Logcap,约等于日志文件总大小*0.80.8是一个安全系数)CkpageBufage是两个浮动的点,BufasyncBufsyncCkpasyncCkpsync是几个固定的点。各个概念的含义如下:

概念

计算

含义

Ckpage

LSN1-LSN4

还没有做Checkpoint的日志范围,若Ckpage超过日志空间,说明被覆盖的日志(LSN1LSN4Logcap)对应日志和数据“可能”还没有刷到磁盘上

Bufage

LSN1-LSN3

还没有将脏页刷盘的日志的范围,若Bufage超过日志空间,说明被覆盖的日志(LSN1LSN3Logcap)对应数据“肯定”还没有刷到磁盘上

Bufasync

日志空间大小*7/8

强制将Bufage-Bufasync的脏页刷盘,此时事务还可以继续执行,所以为async,对事务的执行速度没有直接影响(有间接影响,例如CPU和磁盘更忙了,事务的执行速度可能受到影响)

Bufsync

日志空间大小*15/16

强制将2*(Bufage-Bufasync)的脏页刷盘,此时事务停止执行,所以为sync,由于有大量的脏页刷盘,因此阻塞的时间比Ckpsync要长。

Ckpasync

日志空间大小*31/32

强制写Checkpoint,此时事务还可以继续执行,所以为async,对事务的执行速度没有影响(间接影响也不大,因为写Checkpoint的操作比较简单)

Ckpsync

日志空间大小*64/64

强制写Checkpoint,此时事务停止执行,所以为sync,但由于写Checkpoint的操作比较简单,即使阻塞,时间也很短

当事务执行速度大于脏页刷盘速度时,CkpageBufage会逐步增长,当达到async点的时候,强制进行脏页刷盘或者写Checkpoint,如果这样做还是赶不上事务执行的速度,则为了避免数据丢失,到达sync点的时候,会阻塞其它所有的事务,专门进行脏页刷盘或者写Checkpoint

因此从理论上来说,只要事务执行速度大于脏页刷盘速度,最终都会触发日志保护机制,进而将事务阻塞,导致MySQL操作挂起

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

附注:Innodb的日志保护机制实现可以参考log0log.c文件的void log_check_margins(void)函数。

分享到:
评论

相关推荐

    深入分析MySQL 的备份和恢复机制

    本文讨论 MySQL 的备份和恢复机制,以及如何维护数据表,包括最主要的两种表类型: MyISAM 和 Innodb ,文中设计的 MySQL 版本为 5.0.22。 目前 MySQL 支持的免费备份工具有: mysqldump、mysqlhotcopy ,还可以用 ...

    2017最新老男孩MySQL高级专业DBA实战课程全套【清晰不加密】,看完教程月入40万没毛病

    第九部-老男孩MySQL服务日志详细介绍及增量恢复命令实践(7节) 01-mysqlbinlog命令介绍及实战讲解 02-mysqldump-master-data参数答疑详解 03-MySQL服务错误日志介绍及实践 04-MySQL服务普通查询日志介绍及实践 05-...

    关于MySQL死锁问题的深入分析

    其实如果大家认真研读了我们之前写的3篇关于MySQL中语句加锁分析的文章,加上本篇关于死锁日志的分析,那么解决死锁问题应该也不是那么摸不着头脑的事情了。 准备工作 为了故事的顺利发展,我们需要建一个表: ...

    MySQL管理之道 性能调优、高可用与监控.part2.rar

    从故障诊断、表设计、sql优化、性能参数调优、mydumper逻辑、xtrabackup热备份与恢复、mysql高可用集群搭建与管理、mysql服务器性能和服务监控等方面多角度深入讲解了如何去管理与维护mysql服务器。 书中内容以实战...

    基于mysql体系结构的深入解析

     mysql各个存储引擎概述:innodb存储引擎:[/color][/b] 面向oltp(online transaction processing)、行锁、支持外键、非锁定读、默认采用repeaable级别(可重复读)通过next-keylocking策略避免幻读、插入缓冲、二...

    MySQLInnoDB存储引擎大观

    MySQLInnoDB引擎现在广为使用,它提供了事务,行锁,日志等一系列特性,本文分析下InnoDB的内部实现机制,MySQL版本为5.7.24,操作系统为Debian9。MySQLInnoDB的实现非常复杂,本文只是总结了一些皮毛,希望以后能够...

    2013年中国数据库大会PPT第一部分

    27.深入解析MySQL InnoDB引擎.pdf 28.秒杀场景下MySQL的低效–原因和改进.pdf 29.InnoDB架构分析以及TNT引擎的优势分析.pdf 30.MariaDB对MySQL的改进及未来规划.pdf 31.利用 XEvent进行高级Troubleshooting.pdf

    2013中国数据库大会ppt(1)

    深入解析MySQL InnoDB引擎.pdf 秒杀场景下MySQL的低效–原因和改进.pdf InnoDB架构分析以及TNT引擎的优势分析.pdf MariaDB对MySQL的改进及未来规划.pdf 利用 XEvent进行高级Troubleshooting.pdf 基于SQL Server的...

    2013中国数据大会ppt(2)

    深入解析MySQL InnoDB引擎.pdf 秒杀场景下MySQL的低效–原因和改进.pdf InnoDB架构分析以及TNT引擎的优势分析.pdf MariaDB对MySQL的改进及未来规划.pdf 利用 XEvent进行高级Troubleshooting.pdf 基于SQL Server的...

    2013中国数据库大会ppt(3)

    深入解析MySQL InnoDB引擎.pdf 秒杀场景下MySQL的低效–原因和改进.pdf InnoDB架构分析以及TNT引擎的优势分析.pdf MariaDB对MySQL的改进及未来规划.pdf 利用 XEvent进行高级Troubleshooting.pdf 基于SQL Server的...

Global site tag (gtag.js) - Google Analytics