签到成功

知道了

CNDBA社区CNDBA社区

MySQL Innodb LSN(log sequence number) 说明

2021-08-22 22:33 2664 0 转载 MySQL
作者: dave

1 LSN 概述

LSN(log sequence number)是日志的逻辑序列号,在innodb存储引擎中,lsn占用8个字节。LSN的值会随着日志的写入而逐渐增大。 LSN 类似与Oracle 数据库SCN 的概念。

根据LSN,可以获取到如下信息:

  1. 数据页的版本信息。
  2. 写入的日志总量,通过LSN开始号码和结束号码可以计算出写入的日志量。
  3. 可知道检查点的位置。

LSN不仅存在于redo log中,还存在于数据页中,在每个数据页的头部FILE_HEADER部分,有一个FIL_PAGE_LSN,记录了该数据页最后被修改的日志序列位置。数据页中还存在FIL_PAGE_FILE_FLUSH_LSN(只存在于共享表空间 ,独立表空间中该值为0。该值代表了数据页的文件至少被更新到的位置)。

通过数据页中的LSN值和redo log中的LSN值比较,如果页中的LSN值小于redo log中LSN值,则表示数据丢失了一部分,这时候可以通过redo log的记录来恢复到redo log中记录的LSN值时的状态。

redo log的LSN信息可以通过 show engine innodb status 命令来查看。

mysql> show engine innodb status /G
……
---
LOG
---
Log sequence number 2661403
Log flushed up to   2661403
Pages flushed up to 2661403
Last checkpoint at  2661394
0 pending log flushes, 0 pending chkp writes
12 log i/o's done, 0.00 log i/o's/second
……

其中:

  1. log sequence number: 当前的redo log(in buffer)中的lsn;
  2. log flushed up to: 刷到redo log file on disk中的lsn;
  3. pages flushed up to: 已经刷到磁盘数据页上的LSN;
  4. last checkpoint at: 上一次检查点所在位置的LSN。

2 LSN 的变化过程

innodb从执行修改语句开始:

  1. 首先修改内存中的数据页,并在数据页中记录LSN,暂且称之为data_in_buffer_lsn;
  2. 并且在修改数据页的同时(几乎是同时)向redo log in buffer中写入redo log,并记录下对应的LSN,暂且称之为redo_log_in_buffer_lsn;
  3. 写完buffer中的日志后,当触发了日志刷盘的几种规则时,会向redo log file on disk刷入重做日志,并在该文件中记下对应的LSN,暂且称之为redo_log_on_disk_lsn;
  4. 数据页不可能永远只停留在内存中,在某些情况下,会触发checkpoint来将内存中的脏页(数据脏页和日志脏页)刷到磁盘,所以会在本次checkpoint脏页刷盘结束时,在redo log中记录checkpoint的LSN位置,暂且称之为checkpoint_lsn。
  5. 要记录checkpoint所在位置很快,只需简单的设置一个标志即可,但是刷数据页并不一定很快,例如这一次checkpoint要刷入的数据页非常多。也就是说要刷入所有的数据页需要一定的时间来完成,中途刷入的每个数据页都会记下当前页所在的LSN,暂且称之为data_page_on_disk_lsn。

上图中,从上到下的横线分别代表:http://www.cndba.cn/dave/article/4682

  1. 时间轴、
  2. buffer中数据页中记录的LSN(data_in_buffer_lsn)、
  3. 磁盘中数据页中记录的LSN(data_page_on_disk_lsn)、
  4. buffer中重做日志记录的LSN(redo_log_in_buffer_lsn)、
  5. 磁盘中重做日志文件中记录的LSN(redo_log_on_disk_lsn)
  6. 检查点记录的LSN(checkpoint_lsn)。

假设在最初时(12:0:00)所有的日志页和数据页都完成了刷盘,也记录好了检查点的LSN,这时它们的LSN都是完全一致的。

假设此时开启了一个事务,并立刻执行了一个update操作,执行完成后,buffer中的数据页和redo log都记录好了更新后的LSN值,假设为110。

http://www.cndba.cn/dave/article/4682
http://www.cndba.cn/dave/article/4682

这时候如果执行 show engine innodb status 查看各LSN的值,即图中①处的位置状态,结果会是:

log sequence number(110) > log flushed up to(100) = pages flushed up to = last checkpoint at

之后又执行了一个delete语句,LSN增长到150。等到12:00:01时,触发redo log刷盘的规则(其中有一个规则是 innodb_flush_log_at_timeout 控制的默认日志刷盘频率为1秒),这时redo log file on disk中的LSN会更新到和redo log in buffer的LSN一样,所以都等于150。

这时 show engine innodb status ,即图中②的位置,结果将会是:

http://www.cndba.cn/dave/article/4682

log sequence number(150) = log flushed up to > pages flushed up to(100) = last checkpoint at

再之后,执行了一个update语句,缓存中的LSN将增长到300,即图中③的位置。http://www.cndba.cn/dave/article/4682

假设随后检查点出现,即图中④的位置,正如前面所说,检查点会触发数据页和日志页刷盘,但需要一定的时间来完成,所以在数据页刷盘还未完成时,检查点的LSN还是上一次检查点的LSN,但此时磁盘上数据页和日志页的LSN已经增长了,即:

log sequence number > log flushed up to 和 pages flushed up to > last checkpoint at

但是log flushed up to和pages flushed up to的大小无法确定,因为日志刷盘可能快于数据刷盘,也可能等于,还可能是慢于。

但是checkpoint机制有保护数据刷盘速度是慢于日志刷盘的:当数据刷盘速度超过日志刷盘时,将会暂时停止数据刷盘,等待日志刷盘进度超过数据刷盘。http://www.cndba.cn/dave/article/4682

等到数据页和日志页刷盘完毕,即到了位置⑤的时候,所有的LSN都等于300。

http://www.cndba.cn/dave/article/4682

随着时间的推移到了12:00:02,即图中位置⑥,又触发了日志刷盘的规则,但此时buffer中的日志LSN和磁盘中的日志LSN是一致的,所以不执行日志刷盘,即此时 show engine innodb status 时各种lsn都相等。http://www.cndba.cn/dave/article/4682

随后执行了一个insert语句,假设buffer中的LSN增长到了800,即图中位置⑦。此时各种LSN的大小和位置①时一样。

随后执行了提交动作,即位置⑧。默认情况下,提交动作会触发日志刷盘,但不会触发数据刷盘,所以 show engine innodb status 的结果是:

log sequence number = log flushed up to > pages flushed up to = last checkpoint athttp://www.cndba.cn/dave/article/4682http://www.cndba.cn/dave/article/4682

最后随着时间的推移,检查点再次出现,即图中位置⑨。但是这次检查点不会触发日志刷盘,因为日志的LSN在检查点出现之前已经同步了。假设这次数据刷盘速度极快,快到一瞬间内完成而无法捕捉到状态的变化,这时 show engine innodb status 的结果将是各种LSN相等。

用户评论
* 以下用户言论只代表其个人观点,不代表CNDBA社区的观点或立场
dave

dave

关注

人的一生应该是这样度过的:当他回首往事的时候,他不会因为虚度年华而悔恨,也不会因为碌碌无为而羞耻;这样,在临死的时候,他就能够说:“我的整个生命和全部精力,都已经献给世界上最壮丽的事业....."

  • 2261
    原创
  • 3
    翻译
  • 578
    转载
  • 191
    评论
  • 访问:7971469次
  • 积分:4346
  • 等级:核心会员
  • 排名:第1名
精华文章
    最新问题
    查看更多+
    热门文章
      热门用户
      推荐用户
        Copyright © 2016 All Rights Reserved. Powered by CNDBA · 皖ICP备2022006297号-1·

        QQ交流群

        注册联系QQ