log sequence number
LSN即日志序列号(log sequence number),在InnoDb引擎中,该序列号占8个字节长度,且会随着日志的写入而逐渐增大。LSN是该引擎中用于解决数据一致性的一个部分。
一.LSN的内容
由于LSN可以获取如下等几个信息:
- 数据页的版本信息
- 日志的总量
- CheckPoint的位置
首先从一个命令引入: show engine innodb status\G
,可以得到如下结果:
---
LOG
---
Log sequence number 1030047354
Log flushed up to 1030047354
Pages flushed up to 1030047354
Last checkpoint at 1030047345
#这些参数自上而下的大小关系为>=
对以上几个参数做一个说明:
- Log sequence number是redo log (in buffer)中的lsn
- Log flushed up to 是从redo log in buffer 刷新到redo log in file的lsn
- Pages flushed up to 是表示写入磁盘的dirty page 上的lsn
- Last checkpoint at 是上一次检查点的lsn
这里要注意:Pages flushed up to与Last checkpoint at不一定一致,首先刷新脏页,就会更新checkpoint,但是通过上述内容,我们发现这里存在9的差值,通过查看源码,原来:
oldest_lsn <= log_sys->last_checkpoint_lsn + SIZE_OF_MLOG_CHECKPOINT
/** Size of a MLOG_CHECKPOINT record in bytes.
The record consists of a MLOG_CHECKPOINT byte followed by
mach_write_to_8(checkpoint_lsn). */
#define SIZE_OF_MLOG_CHECKPOINT 9
以上参数在源码中体现为:
fprintf(file,
"Log sequence number " LSN_PF "\n"
"Log flushed up to " LSN_PF "\n"
"Pages flushed up to " LSN_PF "\n"
"Last checkpoint at " LSN_PF "\n",
log_sys->lsn,
log_sys->flushed_to_disk_lsn,
log_buf_pool_get_oldest_modification(),
log_sys->last_checkpoint_lsn);
二.LSN的应用
LSN的应用总结如下:
- 充当一个位置标志,用于记录数据在redolog in buffer、redolog in file、page to disk的序列位置
- 充当Checkout point的序列位置
总结
- LSN的几个参数的定义
- LSN在引擎中的应用:每个页都有LSN、重做日志有LSN、检查点也有LSN