* LSN = log sequeuce number , 日志的序列号,数据库的逻辑时钟, 特点是单调递增
LSN表示事务写入重做日志的字节总量
* LSN是什么?有什么含义?
---
LOG
---
Log sequence number 86594404775 -- redo log buffer 的lsn,存放在redo log buffer 中 我们称: redo_mem_lsn
Log flushed up to 86594404775 -- redo log file 的lsn,存放在redo log 中 我们称: redo_log_lsn
Pages flushed up to 86594404775 -- 最后一个被刷新页的newest_modification, 这个用的比较少,暂时忽略, 这个存放在date page里面
Last checkpoint at 86594404766 -- checkpoint的lsn , 存放在redo log第一个文件的头部 , 我们称: cp_lsn
目前看下来lsn有三个含义
1. redo_mem_lsn
2. redo_log_lsn
3. cp_lsn
4. page_lsn: 每个page里面头部都会记录一个lsn,表示该page最后一次被修改的redo log lsn
以上4个lsn都是互相关联的
* LSN 有什么用?
主要用于MySQL重启恢复
* 恢复的算法如下?
假设: redo_log_lsn = 15000 , cp_lsn=10000 , 这时候MySQL crash了,重启后的恢复流程如下:
a. cp_lsn = 10000 之前的redo 日志,不需要恢复: 因为checkpoint之前的日志已经可以确保刷新完毕
b. 那么 10000 <= redo_log_LSN <= 15000 的日志需要结合page_lsn判断,哪些需要重做,哪些不需要重做。
b.1 redo_log_LSN 日志里面记录的page 操作,如果redo_log_LSN <= page_lsn , 这些日志不需要重做,因为page已经是最新的
b.2 redo_log_LSN 日志里面记录的page 操作, 如果redo_log_LSN >= page_lsn , 这些日志是需要应用到page 里面去的,这一系列操作我们称为恢复.
c. 举个例子
如果:redo_log_lsn 11000 , 记录的是:space id=3,page no=4 的页的操作,但是这个页的page_lsn = 11500,那么说明这个页的lsn比redo的lsn新,那么就不需要应用
如果:redo_log_lsn 11000 , 记录的是:space id=3,page no=4 的页的操作,但是这个页的page_lsn = 10500,那么说明这个页的lsn比redo的lsn老,那么需要应用这部分日志以达到恢复的目的