IT袋

当前位置:主页 > 经验教程 > 建站编程 >

InnoDB数据的三种log类型和作用

InnoDB数据的三种log类型和作用(2)

时间:2023-09-23 22:59:25 来源:IT袋 作者:苏晓敏
导读:InnoDB数据的三种log类型和作用,TRX_UNDO_ACTIVE: 活跃状态,即一个活跃的事务正在往这个段里边写入undolog。 TRX_UNDO_CACHED:被缓存的状态,即该状态下的段等待着之后被其他事务重用。 TRX

InnoDB数据的三种log类型和作用

  • TRX_UNDO_ACTIVE: 活跃状态,即一个活跃的事务正在往这个段里边写入undolog。
  • TRX_UNDO_CACHED:被缓存的状态,即该状态下的段等待着之后被其他事务重用。
  • TRX_UNDO_TO_FREE: 可以释放,对于insert undo链表来说,如果在它对应的事务提交之后,该链表不能被重用,那么就会处于这种状态。
  • TRX_UNDO_TO_PURGE: 可以清理,对于update undo链表来说,如果在它对应的事务提交之后,该链表不能被重用,那么就会处于这种状态。
  • TRX_UNDO_PREPARED: 准备状态,还未提交。

在事务未提交前TRX_UNDO_STATE是TRX_UNDO_PREPARED状态,事务提交后,根据不同的操作类型转换成TRX_UNDO_CACHED、TRX_UNDO_TO_FREE或者TRX_UNDO_TO_PURGE状态,表示满足一定条件后可以清理这些undolog,事务如果需要回滚的话,必须是TRX_UNDO_ACTIVE或者TRX_UNDO_PREPARED状态,故事务的提交是由该属性判断的,详情见下文的事务执行流程。

redolog

redolog是InnoDB存储引擎层的日志,又称重做日志文件,属于物理日志。redolog内存数据存储在log buffer中,磁盘数据则存储在以ib_logfile0、ib_logfile1…命名的日志文件中。

上文提到,InnoDB通过buffer pool(包括change buffer、undolog)提高读写性能,但如果进程或机器崩溃会导致缓存丢失,为了能实现故障恢复就引入了redolog。事务在执行过程中对数据库所做的所有修改(聚集索引、二级索引、undolog等修改)都会生成对应的redolog,并保证redolog早于缓存落盘(WAL机制),当故障发生后,InnoDB会在重启时,通过重放redolog来恢复所做的修改。

到MySQL8.0为止,为了应对各种各样不同的需求,InnoDB已经有多达65种(上限127种)的redolog类型用来记录各种信息,而恢复数据时需要判断不同的类型,来做对应的解析。redolog长度是动态的,常见的数据结构包括日志类型、Space ID、页号、数据页中的偏移量、修改的长度和具体的值。

InnoDB数据的三种log类型和作用

根据redolog不同的作用对象,可以将这些类型划分为三个大类:作用于Page、作用于Space以及提供额外信息的Logic类型。redolog记录的是作用于页的,如果作用于Space,那么页号的值为0。

不管是在内存还是磁盘中,redolog都以块为单位进行存储,默认每个块占512B,等于磁盘扇区的大小,这称为redolog block。每个redolog block由3部分组成:日志块头(12B)、日志块尾(4B)和日志主体(492B),log buffer则是由若干个连续的redolog block组成的,总数不能超过1GB个(基于LSN的长度限制)。

InnoDB为了提高redolog的性能和保证数据一致性,还引入的mini-transaction机制(简称mtr),mtr就是redolog组的概念,比如对一些页面的访问、向聚簇索引或二级索引插入一条记录等操作时产生的redolog是不可分割的(插入数据如果引起索引分裂,会产生许多redolog)。每组的最后一条redolog后边会加上一条类型为MLOG_MULTI_REC_END的redolog,来标识该组的结束。

相关阅读