LSN称为日志的逻辑序列号(log sequence number),在innodb存储引擎中,lsn占用8个字节。LSN的值会随着日志的写入而逐渐增大。InnoDB存储引擎是通过LSN(Log Sequence Number)来标记版本的。LSN是8字节的数字,每个页有LSN,重做日志中也有LSN,Checkpoint也有LSN。可以通过命令SHOW ENGINE INNODB STATUS来观察:本文地址:http://www.04007.cn/article/796.html,未经许可,不得转载.
mysql> show engine innodb status; --- LOG --- Log sequence number 121455128987 Log flushed up to 121455128969 Pages flushed up to 121454813805 Last checkpoint at 121454813805 0 pending log flushes, 0 pending chkp writes 184067533 log i/o's done, 10.20 log i/o's/second本文地址:http://www.04007.cn/article/796.html,未经许可,不得转载.
其中:
log sequence number就是当前的redo log(in buffer)中的lsn;
log flushed up to是刷到redo log file on disk中的lsn;
pages flushed up to是已经刷到磁盘数据页上的LSN
last checkpoint at是上一次检查点所在位置的LSN。本文地址:http://www.04007.cn/article/796.html,未经许可,不得转载.
根据LSN,可以获取到几个有用的信息:1就数据页的版本信息;2是写入的日志总量,通过LSN开始号码和结束号码可以计算出写入的日志量。3可以知道检查点的位置。本文地址:http://www.04007.cn/article/796.html,未经许可,不得转载.
实际上还可以获得很多隐式的信息。LSN不仅存在于redo log中,还存在于数据页中,在每个数据页的头部,有一个fil_page_lsn记录了当前页最终的LSN值是多少。通过数据页中的LSN值和redo log中的LSN值比较,如果页中的LSN值小于redo log中LSN值,则表示数据丢失了一部分,这时候可以通过redo log的记录来恢复到redo log中记录的LSN值时的状态。本文地址:http://www.04007.cn/article/796.html,未经许可,不得转载.
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.04007.cn/article/796.html,未经许可,不得转载.
本文地址:http://www.04007.cn/article/796.html 未经许可,不得转载. 手机访问本页请扫描右下方二维码.
![]() |
![]() |
手机扫码直接打开本页面 |