LSN的含义
LSN全称为 Log Sequence Number,即日志序列号。它是一个不断递增的数字,用来标识事务日志中的每个操作或事件。LSN是一个64位的数字,每一个LSN值都是唯一的,并且随时间线性增加。 通过SHOW ENGINE INNODB STATUS;
可以查看LSN
LSN的运作机制
日志写入
当事务修改数据时,修改操作会首先记录在redo log中,并为每个日志记录分配一个LSN。然后这些修改操作才会应用到数据页(page)上。数据页上的LSN表示该页的最新修改。
检查点(Checkpoint)
检查点将内存中的所有脏页刷新到磁盘,并更新检查点LSN。这个LSN表示所有数据页的状态都一致,且在此LSN之前的所有日志记录都已经应用到数据页中,可以认为是已经完成了持久化。
崩溃恢复
在崩溃恢复过程中,InnoDB从检查点LSN开始扫描redo log,并重做此LSN之后的所有日志记录。这样可以确保所有修改都被应用到数据页中,恢复数据库到崩溃前的一致状态。
LSN的作用
- 日志记录:
- LSN标识每个事务日志记录的位置。每次InnoDB写入日志文件(redo log)时,都会分配一个新的LSN。
- 通过LSN,InnoDB可以确定日志记录的顺序和位置,从而可以精确地进行日志恢复。
- 崩溃恢复:
- 如果MySQL服务器崩溃,InnoDB使用LSN来确定从哪里开始重做(redo)操作。它会从最后一个检查点(checkpoint)的LSN开始,重做所有之后的日志记录,以恢复数据库到一致状态。
- 检查点(Checkpoint):
- 检查点是InnoDB的一种机制,用于减少崩溃恢复时间。在创建检查点时,InnoDB会将内存中的脏页(被修改但尚未写入磁盘的页面)写入磁盘,并更新检查点的LSN。
- 这个LSN表示此检查点时数据库的状态。如果崩溃发生,InnoDB只需要重做这个LSN之后的日志记录。
- 数据文件:
- LSN也会被存储在数据文件中,以跟踪数据文件的最新状态。每个数据页中都有一个LSN,表示该页最后一次被修改时的日志序列号。