几年了,作为一个码农终于把MySQL日记看懂了( 三 )
上面提到LSN比较复杂 , 是因为它有很多个值 , 输入命令"show engine innodb status;" , 可以看到四个的lsn记录
文章插图
图7:LSN值列表
为了方便识别 , 我都为它们重新命名 , 如下 。 名词记不住 , 后面无法继续深入
- 内存日记:redo log buffer lsn;磁盘日记:redo log file lsn;
- 内存数据页:data buffer lsn;数据磁盘数据页:data disk lsn;
- 检查点:chckpoint 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点是假设没有更新 , 最后达到平衡的结果 , 即内存中数据页和日记都完成了刷盘 。
文章插图图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)
文章插图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的简单介绍
文章插图也就是说对于更新的操作 , 如果用到了ChangeBuffer , 更新的数据所在的数据页如果不在内存中 , 将不用去数据磁盘将数据页读到内存 , 而是将这一次操作记录在ChangeBuffer中 , ChangeBuffer 主要节省的则是随机读磁盘的 IO 消耗 , 下次读取查询等读取数据页时用上ChangeBuffer中的记录即可 。 其实也是一种巧用内存的思想 。
- 纠结|硬杠红米Note9Pro?iQOO Z1跌至1575,对比之后纠结了!
- 手机基带|为了5G降低4G网速?中国移动回应来了:罪魁祸首不是运营商
- 车企|华为不造车!但任正非加了一个有效期,3年
- 峰会|这场峰会厉害了!政府企业专家媒体共议网络内容生态治理
- 培育|跨境电商人才如何培育,长沙有“谱”了
- 先别|用了周冬雨的照片,我会成为下一个被告?自媒体创作者先别自乱阵脚
- 巅峰|realme巅峰之作:120Hz+陶瓷机身+5000mAh 做到了颜值与性能并存
- 不负众望|12小时卖了30万部!Redmi Note9不负众望,卢伟冰开心了?
- 蛋壳公寓|官媒发声:绝不能让“割韭菜者”一跑了之!
- 看过明年的iPhone之后,现在下手的都哭了
