🗒️Day64【概念解析】InnoDB Undo Log
00 分钟
2023-11-24
2023-11-24
type
status
date
slug
summary
tags
category
icon
password

整理定义

中文名称:撤销日志
英文名称:Undo Log
MySQL 5.7版本
MySQL 5.7版本
MySQL 8.0版本
MySQL 8.0版本
An undo log is a collection of undo log records associated with a single read-write transaction. An undo log record contains information about how to undo the latest change by a transaction to a clustered index record. If another transaction needs to see the original data as part of a consistent read operation, the unmodified data is retrieved from undo log records. Undo logs exist within undo log segments, which are contained within rollback segments. Rollback segments reside in the system tablespace, in undo tablespaces, and in the temporary tablespace. ——MySQL :: MySQL 5.7 Reference Manual :: 14.6.7 Undo Logs
撤销日志(Undo Log)是与单个读写事务相关联的一组撤销日志记录。撤销日志记录包含有关如何撤消事务对聚簇索引记录的最新更改的信息。如果另一个事务需要在一致性读操作中查看原始数据,则从撤销日志记录中检索未修改的数据。撤销日志存在于撤销日志段(undo log segments)中,这些段包含在回滚段(rollback segements)中。回滚段位于系统表空间(system tablespace)、撤销表空间(undo tablespace)和临时表空间(temporary tablespace)中。
位于临时表空间(temporary tablespace)中的撤销日志(Undo Log)用于修改用户定义的临时表中的数据的事务。这些撤销日志不会被重做记录,因为它们不需要用于崩溃恢复。它们仅在服务器运行时用于回滚。这种类型的撤销日志通过避免重做日志I/O来提高性能。

相关概念解析

聚簇索引(clustered index)
聚簇索引是InnoDB中用于主键索引的术语。InnoDB表存储是根据主键列的值进行组织的,以加快涉及主键列的查询和排序。为了获得最佳性能,请根据性能关键的查询仔细选择主键列。由于修改聚簇索引的列是一项昂贵的操作,请选择很少或从不更新的主键列。
clustered index
The InnoDB term for a primary key index. InnoDB table storage is organized based on the values of the primary key columns, to speed up queries and sorts involving the primary key columns. For best performance, choose the primary key columns carefully based on the most performance-critical queries. Because modifying the columns of the clustered index is an expensive operation, choose primary columns that are rarely or never updated.
撤销日志段(undo log segment)
撤销日志段是一组撤销日志的集合。撤销日志段存在于回滚段中。一个撤销日志段可能包含来自多个事务的撤销日志。一个撤销日志段一次只能被一个事务使用但在事务提交回滚后可以被重新使用。也可以称为“撤销段”。
undo log segment
A collection of undo logs. Undo log segments exists within rollback segments. An undo log segment might contain undo logs from multiple transactions. An undo log segment can only be used by one transaction at a time but can be reused after it is released at transaction commit or rollback. May also be referred to as an “undo segment”.
回滚段
回滚段是包含撤销日志的存储区域。传统上,回滚段位于系统表空间中。从MySQL 5.6开始,回滚段可以位于撤销表空间中。从MySQL 5.7开始,回滚段也分配给全局临时表空间。
rollback segment The storage area containing the undo logs. Rollback segments have traditionally resided in the system tablespace. As of MySQL 5.6, rollback segments can reside in undo tablespaces. As of MySQL 5.7, rollback segments are also allocated to the global temporary tablespace.
撤销表空间
一个Undo表空间包含Undo日志。Undo日志存在于Undo日志段中,这些日志段被包含在回滚段中。回滚段传统上位于系统表空间中。从MySQL 5.6开始,回滚段可以位于Undo表空间中。在MySQL 5.6和MySQL 5.7中,Undo表空间的数量由innodb_undo_tablespaces配置选项控制。在MySQL 8.0中,当MySQL实例初始化时,会创建两个默认的Undo表空间,可以使用CREATE UNDO TABLESPACE语法创建额外的Undo表空间。
undo tablespace
An undo tablespace contains undo logs. Undo logs exist within undo log segments, which are contained within rollback segments. Rollback segments have traditionally resided in the system tablespace. As of MySQL 5.6, rollback segments can reside in undo tablespaces. In MySQL 5.6 and MySQL 5.7, the number of undo tablespaces is controlled by the innodb_undo_tablespaces configuration option. In MySQL 8.0, two default undo tablespaces are created when the MySQL instance is initialized, and additional undo tablespaces can be created using CREATE UNDO TABLESPACE syntax.

复述展开

InnoDB支持最多128个回滚段,其中32个分配给临时表空间。这样就留下了96个回滚段可以分配给修改常规表中的事务innodb_rollback_segments变量定义了InnoDB使用的回滚段数量。
回滚段支持的事务数量取决于回滚段中的撤销槽数量以及每个事务所需的撤销日志数量。回滚段中的撤销槽数量根据InnoDB页面大小而异。如下图所示:
InnoDB Page Size
Number of Undo Slots in a Rollback Segment (InnoDB Page Size / 16)
4096 (4KB)
256
8192 (8KB)
512
16384 (16KB)
1024
32768 (32KB)
2048
65536 (64KB)
4096
一个事务最多分配四个撤销日志,分别用于以下操作类型:
  • 用户定义表上的INSERT操作
  • 用户定义表上的UPDATEDELETE操作
  • 用户定义临时表上的INSERT操作
  • 用户定义临时表上的UPDATEDELETE操作
撤销日志根据需要进行分配。 例如,对常规表临时表执行INSERTUPDATEDELETE操作的事务需要分配四个完整的撤销日志。而只对常规表执行INSERT操作的事务只需要一个撤销日志。
对常规表执行操作的事务从分配的系统表空间撤销表空间回滚段中分配撤销日志。对临时表执行操作的事务从分配的临时表空间回滚段中分配撤销日志。
分配给事务的撤销日志将在事务的整个持续时间内与之关联。 例如,分配给事务的撤销日志用于该事务执行的所有常规表的INSERT操作。

如何估计InnoDB 能够支持的并发读写事务数量

根据上述因素,可以使用以下公式来估计InnoDB能够支持的并发读写事务数量。
  • 如果每个事务执行INSERT,或者执行UPDATE或DELETE操作,那么InnoDB能够支持的并发读写事务数量为:
    • 如果每个事务执行INSERT和UPDATE或DELETE操作,那么InnoDB能够支持的并发读写事务数量为:
    • 如果每个事务在临时表上执行INSERT操作,那么InnoDB能够支持的并发读写事务数量为:
    • 如果每个事务在临时表上执行INSERT和UPDATE或DELETE操作,那么InnoDB能够支持的并发读写事务数量为:

      理解体会

      InnoDB的Undo Log是MySQL数据库中的一个重要组件,它主要用于在事务执行过程中记录数据的旧版本信息,以便在需要时恢复数据。
      定义:Undo Log是一种日志文件,它记录了事务执行过程中对数据的修改前的状态,以便在事务失败或者进行ROLLBACK操作时可以恢复数据。
      作用:
      1. 数据恢复:在事务失败或者进行ROLLBACK操作时,可以通过Undo Log来恢复数据。
      1. 实现MVCC:Undo Log是实现多版本并发控制(MVCC)的关键,它可以提供事务开始时的数据快照,使得每个事务都能看到一致的数据视图。
      磁盘分布情况:Undo Log存储在InnoDB的系统表空间或者独立的Undo表空间中。在MySQL 8.0及更高版本中,推荐使用独立的Undo表空间。【从文章开头的对比图可以看出】
      注意事项:
      1. Undo Log的数量:Undo Log的数量由innodb_undo_logs变量控制。如果这个值设置得太小,那么可能会限制并发事务的数量。如果这个值设置得太大,那么可能会浪费磁盘空间。
      1. Undo Log的大小:Undo Log的大小由innodb_undo_log_truncateinnodb_max_undo_log_size两个变量控制。如果Undo Log的大小超过了innodb_max_undo_log_size,并且innodb_undo_log_truncate设置为ON,那么InnoDB会尝试截断Undo Log以释放磁盘空间。
      📌
      快速跳转链接
      【概念解析】启动
      【概念解析】Day 1 - 10
      【概念解析】Day 11 - 20
      【概念解析】Day 21 - 30
      【概念解析】Day 31 - 40
      【概念解析】Day 41 - 50
      【概念解析】Day 51 - 60
      【概念解析】Day 61 - 70
      【概念解析】Day 71 - 80
      【概念解析】Day 81 - 90
       
      上一篇
      Day65【概念解析】InnoDB Doublewrite Buffer
      下一篇
      Day63【概念解析】InnoDB Redo Log

      评论
      Loading...