文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


17.6.6 撤消日志

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

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

有关撤消日志的静态数据加密的信息,请参见撤消日志加密。

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

回滚段支持的事务数量取决于回滚段中的撤消槽位数和每个事务所需的撤消日志数量。回滚段中的撤消槽位数根据InnoDB页大小而异。

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

事务最多分配四个撤消日志,每个撤消日志对应以下操作类型之一

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

  2. UPDATE 和 DELETE 对用户定义表的操作

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

  4. UPDATE 和 DELETE 对用户定义的临时表的操作

撤消日志根据需要分配。例如,对常规表和临时表执行 INSERT、UPDATE 和 DELETE 操作的事务需要完全分配四个撤消日志。仅对常规表执行 INSERT 操作的事务只需要一个撤消日志。

对常规表执行操作的事务将从分配的撤消表空间回滚段分配撤消日志。对临时表执行操作的事务将从分配的全局临时表空间回滚段分配撤消日志。

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

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

注意

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

当事务对临时表执行操作时,InnoDB 可支持的并发读写事务数量受分配给全局临时表空间的回滚段数量的限制,默认值为 128 个。

  • 如果每个事务执行 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 和 UPDATE 或 DELETE 操作,则 InnoDB 可支持的并发读写事务数量为

    (innodb_page_size / 16 / 2) * innodb_rollback_segments