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日志,每个日志对应以下操作类型之一:
回滚日志被动态分配。例如,执行INSERT
、UPDATE
和DELETE
操作的事务需要四个回滚日志的完整分配。只执行INSERT
操作的事务只需要一个回滚日志。
对常规表进行操作的事务从已分配的回滚表空间回退段中获取回滚日志,而对临时表进行操作的事务从已分配的全局临时表空间回退段中获取回滚日志。
一个事务中的回滚日志在事务生命周期内保持附加。例如,对常规表执行INSERT
操作的事务将使用该事务中所有对常规表执行INSERT
操作的回滚日志。
考虑上述因素,以下公式可以用来估算InnoDB
支持的并发读写事务数量。
可能会在达到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
且 一个UPDATE
或DELETE
操作,InnoDB
可以支持的并发读写事务数量是:(innodb_page_size / 16 / 2) * innodb_rollback_segments