作者:胡呈清

爱可生 DBA 团队成员,擅长故障分析、性能优化,个人博客:https://www.jianshu.com/u/a95ec11f67a8,欢迎讨论。

本文来源:原创投稿

*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。


有一个很久前就存在的疑惑:
在没有写入的情况下,show engine innodb status 中的 Pages flushed up to 为什么不等于 Last checkpoint point?它表示什么?

今天在写一篇文章时,想通过一个测试,从这几个 LSN 的变化来验证一个说法,结果重新勾起了这个问题,在一番“研究”后(其实就是google了一通,当然还是需要一些测试验证),终于弄明白了其中含义。

主要还是借鉴了一篇文章:http://blog.itpub.net/30221425/viewspace-2154670/,因为有大量的源码分析,而我看不懂源码,所以花了不少时间才理解其中原理,并且通过测试验证了其准确性,然后整理成了一个让像我这样不懂代码的人更方便阅读的文档。

今天在写一篇文章时,想通过一个测试,从这几个 LSN 的变化来验证一个说法,结果重新勾起了这个问题,这次我决定彻底弄明白到底是怎么一回事。

主要还是借鉴了一篇文章:http://blog.itpub.net/30221425/viewspace-2154670/,因为有大量的源码分析,而我也看不懂源码,所以花了不少时间才理解其中原理,并且通过测试验证了其准确性,然后整理成了一个更方便让像我这样不懂代码的人理解的文档。

LSN

show engine innodb status 的输出中,有一部分是 LSN 的状态:

mysql> pager grep -A 5 LOG
PAGER set to 'grep -A 5 LOG'
mysql> show engine innodb status\G
LOG
---
Log sequence number 2471197058
Log flushed up to   2471197058
Pages flushed up to 2471197058
Last checkpoint at  2471197049
1 row in set (0.00 sec)

Log sequence number:所有修改数据的操作都会产生 redo log,这是系统当前 redo log 序列号(后面简称 LSN)的最大值;

Log flushed up to:当前已经刷盘的 redo log 的序列号;

Pages flushed up to:讨论的重点;

Last checkpoint at:最后一次 checkpoint 的位置。

Pages flushed up to 到底表示什么?最常见的说法就是脏页刷新到磁盘的 LSN,但 Last checkpoint at 也表示在此之前的数据页已经刷盘,而且通常我们看到的 Pages flushed up to 总是比 Last checkpoint at 大 ,所以这个说法肯定是错误的。

根据参考文章中的源码分析,Pages flushed up to 的取值逻辑是:

Pages flushed up to 取的是所有 buffer pool instance 中的 flush list 中最大 oldest modification lsn 页中的带有最小的 oldest modification lsn 的值(这里可能有点难以理解,我们可以简化理解为取 flush list 中最大的 oldest modification lsn);

如果取到的 oldest modification lsn 为0,意味着没有脏页,那么我们就取 log_sys->lsn 的值,即 show engineinnodb status 显示的 Log sequence number。

LSN 更新的逻辑

取 Pages flushed up to 的目的是什么?因为是取的 flush list 中脏页的最大 LSN,接下来做 checkpoint 时,可以用作这次刷脏的一个结束位置。

在一个正常运行的 MySQL 中,系统 LSN 随着 SQL 的执行(修改数据的SQL)不断增大(实时的),Pages flushed up to 值也会按某个频率获取更新,所以 Pages flushed up to 一般会落后于系统 LSN。然后 InnoDB master thread 每秒和每十秒做 checkpoint 时(还有其他的机制触发 checkpoint,这里不考虑并不影响理解),在将脏页刷盘后会将 Last checkpoint at 的值更新成 Pages flushed up to,由于 Pages flushed up to 在不断更新,所以我们观察到的 Last checkpoint at 一般会小于 Pages flushed up to。

在没数据写入的情况下,为什么 Last checkpoint point 不等于 Pages flushed up to?

是因为做 checkpoint 时同时 redo 日志会写 MLOG_CHECKPOINT,而 MLOG_CHECKPOINT 占用9个字节,所以系统 LSN 会加9,而由于脏页都被刷盘了,flush list 为空,获取 Pages flushed up to 时会直接取系统 LSN 值,所以也会比 Last checkpoint point 大 9。

获取 Pages flushed up to 和 checkpoint 不是一个原子操作,它是在 checkpoint 前就获取了,指的是下一次 checkpoint 结束的位置。

测试验证

我们手工开启一个事务写入一行数据(不提交),会发现如下图所示:

  • Log sequence number 增加了,因为系统 LSN 是实时产生的;

  • Log flushed up to 没变,说明 redo log 还没刷盘(也可能观察到这个值增加并且和 Log sequence number 一致,因为 InnoDB 后台线程每秒会刷 redo log,未提交事务的 redo log 可能提前刷盘);

  • Pages flushed up to 没变,因为这个值不是实时产生的,只要我们手速够快,在执行完 insert 后立刻查看 LSN,就可以看到这个值不变;

  • Last checkpoint point 没变,同样的只要手速够快,在 checkpoint 前查看到的值就不会变。

我们隔几秒钟后再查看 LSN,会发现:所有值都变了,并且前 3个值一样,Last checkpoint point 比它们的值小 9。这是因为InnoDB Master Thread 每秒、每十秒都会做 checkpoint,所有脏页都刷盘后,flush list 为空,符合我们前面所说的原理:

在持续写入的情况下,是可以观察到 Last checkpoint point 等于 Pages flushed up to 的(checkpoint 后还没有获取新的 Pages flushed up to):

技术分享 | show engine innodb status中Pages flushed up to 的含义相关推荐

  1. mysql 打印_故障分析 | MySQL:5.6大事务show engine innodb status故障一例

    作者:高鹏(网名八怪) 文章末尾有他著作的<深入理解 MySQL 主从原理 32 讲>,深入透彻理解 MySQL 主从,GTID 相关技术知识. 本文来源:转载自公众号-老叶茶馆, (作者 ...

  2. show engine innodb status和innodb锁监控

    目录 innodb monitor概述 innodb monitor的类型 innodb标准监控-Standard InnoDB Monitor innodb锁监控-InnoDB Lock Monit ...

  3. checkpoint机制,show engine innodb status

    show engine innodb status G 四个参数能反应出来什么 Checkpoint详解 引子 check point是做什么的 作用 Checkpoint所做的事情 checkpoi ...

  4. show engine innodb status解读

    show engine innodb status解读 参考 https://www.cnblogs.com/xiaoboluo768/p/5171425.html show engine innod ...

  5. MYSQL-show engine innodb status

    mysql> show engine innodb status\G; *************************** 1. row ************************** ...

  6. mysql innodb monitor_mysql:innodb monitor(show engine innodb status)探秘

    在旧的版本里面是show innodb status命令,新版本后改动了一些:show engine innodb status; 我们最熟悉的,应当就是show innodb status命令,可以 ...

  7. mysql死锁分析工具show engine innodb status

    参考文章 <记录一次MySQL死锁的分析与解决过程> <mysql之show engine innodb status解读> <把MySQL中的各种锁及其原理都画出来&g ...

  8. show engine innodb status\G

    mysql> show engine innodb status\G *************************** 1. row *************************** ...

  9. mysql数据库恢复数据_【技术分享】使用Innodb存储引擎的mysql数据库恢复

    作者:维一零 预估稿费:400RMB(不服你也来投稿啊!) 投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿 前言 某天,在测试一张新数据表的字段时,由于在phpmyadmin不断 ...

  10. 开始位置 环状图_【技术分享】如何找到压铸模具中真空阀的最佳位置?

    与砂型和重力铸造相比,传统压铸件的微观结构不尽人意,主要原因是高速金属流在浇口处的喷射,要比金属缓慢喂入砂型或金属模具型腔时更容易接触型腔内的空气.真空压铸工艺的重点是尽量减少这种气液接触,因此,将型 ...

最新文章

  1. Day10_linux计划任务管理
  2. android 自定义view画表格,Android自定义View实现课程表表格
  3. VSS Get Latest Version 没有提示recursive的对话框解决
  4. kaggle房价预测特征意思_Kaggle初探--房价预测案例之数据分析
  5. [整理]使用POI操作Excel相关知识~
  6. Linux常用基本命令总结
  7. 如何将程序下载到单片机
  8. 数据库和 MIDP,第一部分:了解记录管理系统
  9. 阿里巴巴初创时的十八罗汉,离开阿里之后都有什么故事?
  10. vscode及typro快捷键
  11. 计算机开机滴一声513错误,电脑滴一声开不了机怎么办_电脑一声响后就开不了机了的处理办法...
  12. 2021年,手机拼什么?
  13. LR之录制脚本修改完善
  14. 如何使用kodi Mac安装中文插件
  15. 中国交通运输发展白皮书
  16. Python 画图学习入门
  17. 光立方原理讲解_提清晰度最好方法:线性光+高反差太粗糙业余
  18. C语言程序设计作业07:第十六周作业
  19. 倒计时秒杀html模板,显示抢购倒计时秒杀
  20. 大数据最佳实践-基于Spark的ETL开发

热门文章

  1. 两小时从零学会vue-admin-template框架
  2. 安卓初始画面去黑色背景
  3. android打开dialog黑色背景
  4. 欧拉计划第80题:平方根数字展开
  5. Paper | Detail-revealing Deep Video Super-resolution
  6. torch.nn.Embedding的函数
  7. 编写算法将数字编号“翻译”成英文编号(C语言)
  8. msdn突然无法使用,打开的页面无法正常显示。
  9. APISpace 文本情感倾向分析API
  10. ECU软件开发介绍篇