Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


17.6.6 撤消日志

撤消日志是一组与单个读写事务相关的撤消日志记录。撤消日志记录包含了关于如何撤消事务对聚簇索引记录的最新更改的信息。如果另一个事务需要在一致性读操作中看到原始数据,撤消日志记录将从中检索未修改的数据。撤消日志存在于撤消日志段中,这些段落包含在回滚段中。回滚段驻留在撤消表空间和全局临时表空间中。

在全局临时表空间中的撤消日志用于事务,它们修改了用户定义的临时表中的数据。这些撤消日志不需要redo日志,因为它们不需要崩溃恢复。它们仅用于服务器运行时的回滚操作。这类撤消日志通过避免redo日志I/O来提高性能。

关于撤消日志的数据在休息加密,请参阅撤消日志加密

每个撤消表空间和全局临时表空间都支持最多128个回滚段。innodb_rollback_segments变量定义了回滚段的数量。

回滚段支持的事务数量取决于回滚段中的undo slot数量和每个事务所需的undo日志数量。回滚段中的undo slot数量根据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

事务被分配到最多四个undo日志,每个日志对应以下操作类型之一:

  1. INSERT 用户定义表的操作

  2. UPDATEDELETE 用户定义表的操作

  3. INSERT 用户定义临时表的操作

  4. UPDATEDELETE 用户定义临时表的操作

回滚日志被动态分配。例如,执行INSERTUPDATEDELETE操作的事务需要四个回滚日志的完整分配。只执行INSERT操作的事务只需要一个回滚日志。

对常规表进行操作的事务从已分配的回滚表空间回退段中获取回滚日志,而对临时表进行操作的事务从已分配的全局临时表空间回退段中获取回滚日志。

一个事务中的回滚日志在事务生命周期内保持附加。例如,对常规表执行INSERT操作的事务将使用该事务中所有对常规表执行INSERT操作的回滚日志。

考虑上述因素,以下公式可以用来估算InnoDB支持的并发读写事务数量。

Note

可能会在达到InnoDB支持的并发读写事务数之前遇到并发事务限制错误。这是因为一个回滚段分配给事务时,undo slots用完了。在这种情况下,可以尝试重新运行事务。

当事务对临时表进行操作时,InnoDB支持的并发读写事务数受到全球临时表空间中 rollback segments 数量的限制,该数量默认为128。

  • 如果每个事务执行 either 一个INSERT、一个UPDATE或一个DELETE操作,InnoDB支持的并发读写事务数为:

    (innodb_page_size / 16) * innodb_rollback_segments * number of undo tablespaces
  • 如果每个事务执行一个INSERT,同时执行一个UPDATE或一个DELETE操作,InnoDB支持的并发读写事务数为:

    (innodb_page_size / 16 / 2) * innodb_rollback_segments * number of undo tablespaces
  • 如果每个事务对临时表执行一个INSERT操作,InnoDB可以支持的并发读写事务数量是:

    (innodb_page_size / 16) * innodb_rollback_segments
  • 如果每个事务对临时表执行一个INSERT 一个UPDATEDELETE操作,InnoDB可以支持的并发读写事务数量是:

    (innodb_page_size / 16 / 2) * innodb_rollback_segments