14.6.7 撤消日志

撤消日志是与单个读写事务关联的撤消日志记录的集合。撤消日志记录包含有关如何撤消事务对clustered index记录的最新更改的信息。如果另一个事务需要将原始数据视为一致读取操作的一部分,则将从撤消日志 Logging 检索未修改的数据。撤消日志存在于撤消日志段中,包含在rollback segments中。回滚段位于system tablespaceundo tablespacestemporary tablespace中。

驻留在临时 table 空间中的撤消日志用于修改用户定义的临时 table 中的数据的事务。这些撤消日志未重做记录,因为崩溃恢复不需要它们。它们仅在服务器运行时用于回滚。这种类型的撤消日志通过避免重做日志 I/O 来提高性能。

InnoDB支持最多 128 个回滚段,其中 32 个回滚段分配给了临时 table 空间。剩下的 96 个回滚段可以分配给修改常规 table 中数据的事务。 innodb_rollback_segments变量定义InnoDB使用的回滚段数。

回滚段支持的事务数取决于回滚段中的撤消插槽数和每个事务所需的撤消日志数。

回退段中撤消插槽的数量根据InnoDB页的大小而有所不同。

InnoDB 页面大小回滚段中的撤消插槽数(InnoDB 页面大小/ 16)
4096 (4KB)256
8192 (8KB)512
16384 (16KB)1024
32768 (32KB)2048
65536 (64KB)4096

一个事务最多可以分配四个撤消日志,以下每种操作类型都可以分配一个:

  • INSERT对用户定义 table 的操作

  • 用户定义的 table 上的UPDATEDELETE操作

  • INSERT对用户定义的临时 table 的操作

  • 用户定义的临时 table 上的UPDATEDELETE操作

撤消日志根据需要分配。例如,对常规 table 和临时 table 执行INSERTUPDATEDELETE操作的事务需要完全分配四个撤消日志。仅对常规 table 执行INSERT操作的事务需要单个撤消日志。

从已分配的系统 table 空间或撤消 table 空间回滚段中分配了对常规 table 执行操作的事务的撤消日志。从指定的临时 table 空间回滚段中分配了对临时 table 执行操作的事务的撤消日志。

分配给事务的撤消日志在其持续时间内一直与事务相关。例如,为常规 table 上的INSERT操作分配给事务的撤消日志将用于该事务对常规 table 上的所有INSERT操作。

给定上述因素,以下公式可用于估计InnoDB能够支持的并发读写事务数。

Note

事务在达到InnoDB能够支持的并发读写事务数之前可能会遇到并发事务限制错误。当分配给事务的回滚段用尽撤消插槽时,就会发生这种情况。在这种情况下,请尝试重新运行事务。

当事务对临时 table 执行操作时,InnoDB能够支持的并发读写事务数受分配给临时 table 空间的回滚段数(即 32)所限制。

  • 如果每个事务执行INSERT **或UPDATEDELETE操作,则InnoDB能够支持的并发读写事务数为:
(innodb_page_size / 16) * (innodb_rollback_segments - 32)
  • 如果每个事务执行INSERT UPDATEDELETE操作,则InnoDB能够支持的并发读写事务数为:
(innodb_page_size / 16 / 2) * (innodb_rollback_segments - 32)
  • 如果每个事务在临时 table 上执行INSERT操作,则InnoDB能够支持的并发读写事务数为:
(innodb_page_size / 16) * 32
  • 如果每个事务在临时 table 上执行INSERT UPDATEDELETE操作,则InnoDB能够支持的并发读写事务数为:
(innodb_page_size / 16 / 2) * 32