几年了,作为一个码农终于把MySQL日记看懂了( 五 )


  1. 将page2读入内存
  2. 依次应用change buffer中的记录 , 得到最新版数据页
  3. 写入redo , 之前记录的changebuffer改动 , 现在改成数据页的改动
至于changebuffer被应用后是删除还是标记 , 还有redo中原有的记录changebuffer的改动怎么调整是删除还是修改成数据页的改动这里下面的图是按照自己的想法描述出来 , 如有误望留言指正 。
几年了,作为一个码农终于把MySQL日记看懂了文章插图
8.3.3 数据刷盘过程数据刷盘flush的有四种情况
  1. InnoDB 的 redo log 写满了 。 这时候系统会停止所有更新操作 , 把 checkpoint 往前推进 , redo log 留出空间可以继续写
  2. 系统内存不足 。 当需要新的内存页 , 而内存不够用的时候 , 就要淘汰一些数据页 , 空出内存给别的数据页使用 。 如果淘汰的是“脏页” , 就要先将脏页写到磁盘
  3. MySQL 认为系统“空闲”的时候
  4. MySQL 正常关闭的情况
数据刷盘也代表着Redo log检查点checkpoint触发 , 这一步将联系到第六章6.7和6.8中的章节内容 , 较为复杂 。
假设数据刷盘flush的四种情况发生了一种 , 那么联系上文的过程将如下
  1. 将脏页从内存中刷回到数据磁盘
  2. 刷完后更新检查点checkpoint的值

几年了,作为一个码农终于把MySQL日记看懂了文章插图
流程中间某个环节数据库宕机后 , 恢复具体过程 , 这些留在心里了 , 没往上去写 , 读者可以自行思考 , 不难 。
九、结尾整个文章讲了Binlog、Undo log和Redo log , 随带一提ChangeBuffer , 前面四五六七章是分讲 , 最后第八章是对整个日记相关联讲解 。 对此 , 讲到这里 , 基本上要把我要讲的已经讲完 , 内容挺多 , 有耐心可以慢慢啃 , 不懂欢迎留言!
思考环节 , 下面留下两个问题 , 欢迎大家留言解答
1、为啥Binlog没有crash-safe功能?
2、保证crash-safe为啥要用两个日记 , 不能用一个日记吗(Redo log或Binglog)?
作者: 神韵_499
原文链接: