redo mysql_从5.6到8.0看MySQL写Redo进化史(下)

2358d83ad72f60c38600da37f1e61e58.png

上篇文章《从5.6到8.0看MySQL写Redo进化史》介绍了Buffer Pool中多种链表的管理,相信大家对这些链表有了初步的认识,同时也有一些关于刷新脏页的疑问,本文就继续介绍InnoDB的脏页刷新策略——Checkpoint机制及Redo Log刷盘规则。

Checkpoint机制

在介绍checkpoint机制前先了解两个概念:

脏页(Dirty Page)

如果一个数据页在内存中修改了,但是还没有刷新到磁盘。这个数据页就称为脏页日志顺序号(Log Sequence Number)

LSN表示重做日志的序号,8字节的数字,特点是单调递增型,代表每个重做日志的编号,也就意味着每个日志都有一个LSN与其对应。另外LSN的增长是使用字节偏移量来表示,就是重做日志每增加多少个字节,LSN就增加多少字节,所以LSN也是事务写入到重做日志的字节总量。

LSN不仅仅记录在重做日志中,它存在于多个对象中,表示的含义各不相同:重做日志(redo log)、页(page)、检查点(checkpoint)。在每个Page上都有对应的这个页第一次修改的LSN号和最新一次修改的LSN号(通过系统视图 information_schema.INNODB_BUFFER_PAGE_LRU 可以看到)。

每个页头部有一个值FIL_PAGE_LSN,该变量用于记录页的LSN,表示该页最后刷新时LSN的大小。因为重做日志记录的是每个页的日志,因此页中的LSN用来判断页是否需要进行恢复操作。例如,页P1的LSN为1000,而数据库启动时,InnoDB检测到写入重做日志中该P1页LSN为1300,并且该事务已经提交,那么数据库需要进行恢复操作,将重做日志应用到P1页中。同样的,对于重做日志中LSN小于P1页的LSN,则不需要进行重做,因为P1页中的LSN表示页已经被刷新到该位置。

Checkpoint(检查点)也通过LSN的形式来保存,其表示页已经刷新到磁盘的LSN位置,当数据库重启时,仅需从检查点开始进行恢复操作。若检查点的LSN与重做日志相同(但一般不会遇见检查点LSN与重做日志LSN相同,一般重做日志LSN比检查点LSN大,具体后面说),表示所有页都已经刷新到磁盘,不需要进行恢复操作了。用Redo Log LSN减去Checkpoint LSN就是需要恢复的数据。

Checkpoint解决的问题:缩短数据库恢复时间

当数据库发生宕机时,数据库不需要重做所有的Redo Log,因为Checkpoint之前的页都已经刷新回磁盘。数据库只需对Redo Log LSN – Checkpoint LSN的重做日志进行恢复,大大缩短了恢复的时间。确保缓冲池有空闲页

当缓冲池不够用时,根据LRU算法会溢出最近最少使用的页,若此页为脏页,那么需要强制执行Chec

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值