15.6.6-Undo日志

一个undo log是与一个读写事务相关联的undo log记录集合。一条undo log记录包含了回滚对一条聚簇索引做的修改所需的信息。如果另一个事务在一致性读时需要查询原始数据,就会动undo log记录中获取修改之前的数据。undo log存在于undo log段,undo log段包含在回滚段里。回滚段在undo表快哦那件,和全局临时表空间中。

全局临时表空间中的undo日志服务于修改用户自定义临时表的事务。这些undo日志没有记录redo日志,因为它们不需要崩溃恢复。它们只用于服务运行时的回滚。这种类型的undo日志不需要记录redo日志,节约了I/O。

想了解undo日志相关的数据加密信息,请查阅 Undo Log Encryption

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

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

innodb页面大小回滚段中undo槽的数量 (InnoDB Page Size / 16)
4KB256
8KB512
16KB1024
32KB2048
64KB4096
一个事务最多会被分配最多4条undo日志,每种所适用的操作类型不同:
  1. 用户自定义表上的insert操作。
  2. 用户自定义表上的update操作和delete操作。
  3. 用户自定义临时表上的insert操作。
  4. 用户自定义临时表上的update操作和delete操作。 undo日志是按需分配的。例如,一个在常规表和临时表上执行insert,update,和delete操作的事务,4种类型的日志会分配全。一个只在常规表上执行insert操作的事务,只会分配一条undo日志。

一个对常规表执行操作的事务所分配的undo日志位于所分配的undo表空间的回滚段中。一个对临时表执行操作的事务所分配的undo日志位于全局临时表空间中的回滚段中。

分配给事务的undo日志在事务执行过程中一直和事务关联。例如,分配给一个对常规表执行insert操作的事务的undo日志,将被用于这个事务执行的所有对常规表的insert操作。

考虑到上述因素,下面的公式可被用于估算InnoDB所能支持的并发读写事务数量。

在达到innodb能够支持的并发读写事务数量上限之前,就可能遇到并发事务数量限制错误。当分配给一个事务的回滚段中的undo槽被用完时,就会发生这种错误。在这种场景下,可以尝试重新执行事务。
当事务执行对临时表的操作时,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