Documentation Home

14.6.7 撤消日志

撤消日志是与单个读写事务关联的撤消日志记录的集合。撤消日志记录包含有关如何撤消事务对聚集索引 记录的最新更改的信息。如果另一个事务需要将原始数据视为一致读取操作的一部分,则未修改的数据将从撤消日志记录中检索。撤消日志存在于 撤消日志段中,而撤消日志段包含在 回滚段中。回滚段位于 系统表空间撤消表空间临时表空间中。

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

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

一个回滚段支持的事务数取决于回滚段中的undo槽数和每个事务需要的undo日志数。回滚段中撤消槽的数量根据 InnoDB页面大小而不同。

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

事务最多分配四个撤消日志,一个用于以下操作类型:

  1. INSERT对用户定义表的操作

  2. UPDATEDELETE对用户定义表的操作

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

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

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

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

分配给事务的撤消日志在其持续时间内保持附加到事务。例如,分配给对常规表进行INSERT 操作的事务的撤消日志用于该事务对常规表执行的所有 INSERT操作。

考虑到上述因素,可以使用以下公式来估计InnoDB能够支持的并发读写事务数。

笔记

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

事务对临时表进行操作时,能够支持的并发读写事务 InnoDB数受分配给临时表空间的回滚段数限制,即32个。

  • 如果每个事务执行一个 一个 或 操作,则能够支持 的并发读写事务数 为:INSERT UPDATEDELETEInnoDB

    (innodb_page_size / 16) * (innodb_rollback_segments - 32)
  • 如果每个事务执行 and和or 操作 ,则能够支持 的并发读写事务数 为:INSERT UPDATEDELETEInnoDB

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

    (innodb_page_size / 16) * 32
  • 如果每个事务对临时表执行 and和or 操作 ,则能够支持 的并发读写事务数 为:INSERT UPDATEDELETEInnoDB

    (innodb_page_size / 16 / 2) * 32