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


上面提到LSN比较复杂 , 是因为它有很多个值 , 输入命令"show engine innodb status;" , 可以看到四个的lsn记录
几年了,作为一个码农终于把MySQL日记看懂了文章插图
图7:LSN值列表
为了方便识别 , 我都为它们重新命名 , 如下 。 名词记不住 , 后面无法继续深入

  1. 内存日记:redo log buffer lsn;磁盘日记:redo log file lsn;
一般关系为:redo log buffer lsn >= redo log file lsn , 如果刷盘时机为1 , 则redo log buffer lsn = redo log file lsn 。
  1. 内存数据页:data buffer lsn;数据磁盘数据页:data disk lsn;
一般关系为data buffer lsn > data disk lsn , 如果已经刷入数据磁盘 , 则data buffer lsn = data disk lsn 。
  1. 检查点:chckpoint lsn;
后面提到检查点刷盘 , 数据刷盘和日记刷盘(如果有日记刷盘:则说明我假设的日记刷盘的时机设置值不为1 , 为1是同步的 , 即始终redo log buffer lsn = redo log file lsn , 不会由检查点触发刷日记磁盘) 。
都说Redo log是环形记录 , 那么怎么记录的?下面结合LSN给出记录过程虚构图 , 可以对比6.6 Redo log 存储方式图相关知识:日记磁盘 + redo log file lsn + checkpoint lsn + 双指针(write pos、check point)
1-8按时间顺序发生 。 1点是假设最初的状态;2、3点写日记磁盘;4点是触发了检查点checkpoint , 进行刷盘 , checkpoint lsn=1开始 , 刷盘结束并更新checkpoint lsn=512 。 在5点、6点已经刷过了一循环内存、二循环内存 , 从头开始写入log , 两个指针指向回到了头部 。 第7点也是一个触发checkpoint的过程 。 9点是假设没有更新 , 最后达到平衡的结果 , 即内存中数据页和日记都完成了刷盘 。
几年了,作为一个码农终于把MySQL日记看懂了文章插图
图8:Redo Log File存储过程
整个流程:
在某些情况下 , 触发checkpoint , 触发数据页和日志页刷盘 , 此时将内存中的脏数据---"数据脏页"和"日志脏数据" 分别刷到数据磁盘和日记磁盘中 , 而且两者刷盘速度不一样 。 checkpoint会保护机制 , 当数据刷盘速度超过日志刷盘时 , 将会暂时停止数据刷盘 , 等待日志刷盘进度超过数据刷盘 。
刷盘时 , 对于数据磁盘 , 全部都是在内存中 , 此时每次刷一个数据页到内存更新数据页也更新了data disk lsn为data buffer lsn(在更新内存数据页时 , 会更新data buffer lsn) 。
对于日记磁盘 , 除了要记录checkpoint lsn的值为检查点 checkpoint的值(必须在结束时 直接记录一个值 , 速度很快) , 这里是针对日记刷盘时机不是1(1是同步缓存刷日记刷盘)时 , 并且日记还没刷到日记磁盘需要触发将缓存中日记提前刷到日记磁盘中 , 此时会将redo buffer log刷到redo log file中也更新了redo log file lsn为redo log buffer lsn。
模拟检查点触发前后 , 整个流程变化 , 一个数据页和日记 , 数据变化及lsn从179-180的变化图(刷盘时机不为1)
几年了,作为一个码农终于把MySQL日记看懂了文章插图
6.9 Redo log 容灾恢复过程与LSN结合6.4 Redo log 容灾恢复过程和6.8的LSN知识 , 再次细化6.4的Redo log恢复过程
重启innodb时 , Redo log完不完整 , 采用6.4知识过程 。 用Redo log恢复 , 启动数据库时 , InnoDB会扫描数据磁盘的数据页data disk lsn和日志磁盘中的checkpoint lsn 。 两者相等则从checkpoint lsn点开始恢复 , 恢复过程是利用 redo log到buffer pool , 直到checkpoint lsn等于redo log file lsn , 则恢复完成 。
如果checkpoint lsn 小于 data disk lsn , 说明在检查点触发后还没结束刷盘时数据库宕机了 。 因为checkpoint lsn最新值是在数据刷盘结束后才记录的 , 检查点之后有一部分数据已经刷入数据磁盘 , 这个时候数据磁盘已经写入部分的部分恢复将不会重做 , 直接跳到没有恢复的lsn值开始恢复 。
七、了解 ChangeBuffer7.1 为啥提到ChangeBuffer为啥本文我会提到ChangeBuffer呢 , 其实很多时候会将ChangeBuffer和Redo log搞混 , 两者都是巧用内存 , 减少磁盘IO , 为了不弄混我觉得有必要专门对这个进行一个讲解 。
7.2 ChangeBuffer概念及作用下面是我对ChangeBuffer的简单介绍
几年了,作为一个码农终于把MySQL日记看懂了文章插图
也就是说对于更新的操作 , 如果用到了ChangeBuffer , 更新的数据所在的数据页如果不在内存中 , 将不用去数据磁盘将数据页读到内存 , 而是将这一次操作记录在ChangeBuffer中 , ChangeBuffer 主要节省的则是随机读磁盘的 IO 消耗 , 下次读取查询等读取数据页时用上ChangeBuffer中的记录即可 。 其实也是一种巧用内存的思想 。