IT袋

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

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

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

时间:2023-09-23 22:59:25 来源:IT袋 作者:苏晓敏
导读:InnoDB数据的三种log类型和作用,一篇方法教程,与您分享InnoDB数据的三种log类型和作用方面的内容,下面来一起了解一下吧。 undolog undolog是InnoDB的日志,又称撤销日志文件,属于逻辑日志。undolog内存数

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

一篇方法教程,与您分享InnoDB数据的三种log类型和作用方面的内容,下面来一起了解一下吧。

undolog

undolog是InnoDB的日志,又称撤销日志文件,属于逻辑日志。undolog内存数据存储在buffer pool中,磁盘数据则存储在undo tablespace。

undolog保存类型为FIL_PAGE_UNDO_LOG在undo page中,一个undo page可以保存多条undolog记录。每条undolog记录包含该undolog在undo page的页内地址、undolog对应的记录所在的tableId(tableId全局唯一)、undolog类型、undolog编号、下一条undolog的地址、old_trx_id、old_roll_pointer、主键的每个列占用的存储空间大小和真实值、被修改字段的修改前后信息等。

undolog提供回滚和多个行版本控制(MVCC)的两个能力,保证了事务的原子性:

  • 回滚:undolog分为3类,包括TRX_UNDO_INSERT_REC、TRX_UNDO_DEL_MARK_REC、TRX_UNDO_UPD_EXIST_REC,分别对应增、删、改操作。上文讲到每一行数据有两个隐藏字段trx_id和roll_pointer,它们主要作用于数据库的事务。所谓的事务就是指对一个或多个数据库的一系列操作,这些操作需保证ACID的规则。当某个事务执行过程中对某个表执行了增、删、改操作,InnoDB会给该事务分配一个递增的独一无二的trx_id(全局变量,每增加256时会刷盘),而且会生成对应的undolog,而roll_pointer就是一个指向记录对应的undolog的一个指针,数据行会存储最近提交的trx_id和roll_pointer。事务开启后,在本事务或其他事务(根据事务隔离级别)对该数据行的一次次修改中,生成的undolog会记录old_trx_id(修改该记录的上一次的trx_id)和old_roll_pointer(对应undolog地址),这样就生成了一个版本链,当需要回滚时就能沿着old_trx_id和old_roll_pointer找到一条记录的所有历史版本,从而实现事务的回滚能力。
  • MVCC:InnoDB复用了undolog中已经记录的历史版本数据来实现MVCC机制。当用户读取一行记录时,若该记录已经被其他事务占用,当前事务可以通过undolog读取之前的行版本信息,以此实现非锁定读取。此外,根据trx_id是递增的特性,InnoDB还引入了ReadView机制,用于保存创建事务时的活跃trx_id。ReadView有三个属性,分别是m_ids(活跃的trx_id列表)、min_trx_id(活跃的最小trx_id)、max_trx_id(下一个该分配的trx_id),基于这三个属性,实现了READ COMMITTED和REPEATABLE READ两种隔离级别。

因为一个事务可能包含多个增、删、改操作,为了提高并发执行多个事务写入undolog的性能,InnoDB将各个事务的各种操作通过上文提到的undo segment分开存储(undo segment的undo page通过链式存储,即每个事务都有自己的insert undo链表、update undo链表),而每个段的第一个undo page通过TRX_UNDO_STATE属性存储了该段的一些事务信息,取值有下面几个:

相关阅读