当前位置: 代码网 > it编程>数据库>Mysql > MySQL之undo日志页结构详解

MySQL之undo日志页结构详解

2025年06月26日 Mysql 我要评论
1、背景之前讲过undo日志类型,本篇文章再来具体讲解一下undo日志页结构。2、undo日志页结构【1】fil_page_undo_log页innodb中最基本的存储单位是页,undo日志也是存储在

1、背景

之前讲过undo日志类型,本篇文章再来具体讲解一下undo日志页结构。

2、undo日志页结构

【1】fil_page_undo_log页

innodb中最基本的存储单位是页,undo日志也是存储在页上的,页的类型为fil_page_undo_log,其页面结构如下:

在这里插入图片描述

其中undo page header是undo日志所特有的,其结构如下:

在这里插入图片描述

字段含义为:

字段字节大小含义
trx_undo_page_type2本页存储undo日志类型,分为两大类:trx_undo_inset和trx_undo_update,一个页面只能存储一种类型
trx_undo_page_start2本页中第一条undo日志地址
trx_undo_page_free2本页可以写入undo日志的空闲地址
trx_undo_page_node12链表节点

【2】undo页面组成的链表

通过undo page header的trx_undo_page_node属性能让undo页组成一个链表,链表中的第一个页被称为first undo page,第二个页被称为normal undo page,上面讲过有两大类undo日志类型,一个页只能存储相同的页类型,所以一个事务的所有插入操作可以组成一个insert undo链表,所有删除和更新操作可以组成一个update undo链表,临时表也需要记录undo日志,所以一个事务可能产生四个undo页组成的链表,这些链表是用到的时候再分配。

【3】undo log segment

每个undo日志页组成的链表都对应一个,叫undo log segment,这个段存储在链表的第一个页也就是first undo page页中,其结构如下:

在这里插入图片描述

其中undo log segment header用来存储段结构信息,其结构如下:

在这里插入图片描述

字段含义如下:

字段字节大小含义
trx_undo_state2链表对应的段状态:
trx_undo_active:活跃状态,一个活跃的事务正在往这个段里面写入undo日志
trx_undo_cached:被缓存的状态,该undo页面对应的来吧等待被其它实物重用
trx_unod_to_free:对insert undo链表来说,在它对应的事务提交之后,该链表不能被重用就处于这种状态
trx_undo_to_purge:对update undo链表来说,在它对应的事务提交之后,该链表不能被重用就处于这种状态
trx_undo_prepared:包含处于prepare阶段的事务产生的undo日志
trx_undo_last_log2本undo页面链表中最后一个undo log header的位置
trx_undo_fseg_header10本undo页链表对应的段信息
trx_undo_page_list16undo页链表基节点,这个基节点就存在于first undo page页中

【4】undo log header

同一个事务向同一个undo页面链表中写入的undo日志算一个组,组信息存储在链表第一个页的undo log header属性中,first undo page页可以这样表示:

在这里插入图片描述

undo log header结构如下:

在这里插入图片描述

字段含义如下:

字段字节大小含义
trx_undo_trx_id8生成本组undo日志的事务id
trx_undo_trx_no8事务提交后生成的序号,用来标记事务的提交顺序
trx_undo_del_marks2标记本组undo日志是否包含由于delete mark操作产生的undo日志
trx_undo_log_start2本组undo日志第一条undo日志在页面中的地址
trx_undo_xid_exists1本组undo日志是否包含xid信息
trx_undo_dict_trans1标记本组undo日志是不是由ddl语句产生
trx_undo_table_id8ddl语句操作的表table_id
trx_undo_next_log2下一组undo日志在页面中开始的偏移量
trx_undo_prev_log2上一组undo日志在页面中开始的偏移量
trx_undo_history_node12history链表的节点

【5】重用undo页面

为了节省空间就有了重用undo页面,重用undo页面需要满足以下条件:

  • 1、undo页面链表只包含一个undo页面
  • 2、该undo页面链表使用空间超过该页面空间的3/4
  • 3、insert undo链表是覆盖写入
  • 4、update undo链表是追加写入

3、总结

通过undo日志能保证事务回滚,也就是原子性,上面讲过insert操作对应的undo日志可以直接删除,update和delete操作的不能,就是为了mvcc,多版本并发控制,后面再来讲解mvcc。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

  • mysql中的数据目录用法及说明

    mysql中的数据目录用法及说明

    1、背景安装mysql之后,在安装目录下会有一个data目录,我们创建的数据库、创建的表、插入的数据都是存储在这个目录中,可以大概了解一下这个目录下是怎么存储数... [阅读全文]
  • MySQL之InnoDB存储页的独立表空间解读

    1、背景我们往一张表里插入的行数据是存储在页上的,一张页的大小为16kb,数据量大的时候一张页不可能存储完一张表里的所有数据,所以需要多张页来进行存储,这多张页所在的存储空间就叫表…

    2025年06月26日 数据库
  • MySQL中的InnoDB单表访问过程

    MySQL中的InnoDB单表访问过程

    1、背景mysql通过查询条件查询到结果的过程就叫访问方法,一条查询语句的访问方法有很多种,接下来我们就来讲一下各种访问方法。2、环境创建表:mysql>... [阅读全文]
  • MySQL 中 ROW_NUMBER() 函数最佳实践

    MySQL 中 ROW_NUMBER() 函数最佳实践

    mysql 中row_number()函数详解row_number()是 sql 窗口函数中的一种,用于为查询结果集中的每一行分配一个​​唯一的连续序号​​。与... [阅读全文]
  • MySQL中的表连接原理分析

    MySQL中的表连接原理分析

    1、背景在进行sql查询时有时需要多张表的查询结果组成一个共同的结果返回,这时就用到了mysql中连接的用法,接下来就以两张表来讲解表连接的原理。2、环境创建两... [阅读全文]
  • MySQL InnoDB中的Buffer Pool用法及说明

    MySQL InnoDB中的Buffer Pool用法及说明

    1、背景mysql数据是存储在磁盘上的,但是从磁盘上读取数据的速度太慢,所以就需要把数据从磁盘读取在内存中,申请的这块内存就叫buffer pool,也就是缓存... [阅读全文]

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com