撤销日志是与单个读写事务关联的一组撤销日志记录。撤销日志记录包含有关如何撤销事务对聚簇索引记录的最新更改的信息。如果另一个事务需要作为一致读操作的一部分查看原始数据,则从撤销日志记录中检索未修改的数据。撤销日志存在于撤销日志段中,这些段包含在回滚段中。回滚段驻留在撤销表空间和全局临时表空间中。
驻留在全局临时表空间中的撤销日志用于修改用户定义的临时表中的数据。这些撤销日志不进行重做日志记录,因为它们不需要崩溃恢复。它们仅用于回滚,而服务器正在运行。这类撤销日志可以通过避免重做日志I/O来提高性能。
有关撤销日志的静态数据加密信息,请参阅撤销日志加密。
每个撤销表空间和全局临时表空间单独支持最多128个回滚段。innodb_rollback_segments
变量定义回滚段的数量。
回滚段支持的交易数量取决于回滚段中的撤销槽数量和每个交易所需的撤销日志数量。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 |
交易可以分配最多四个撤销日志,每个用于以下操作类型:
撤销日志根据需要分配。例如,一个执行 INSERT
、UPDATE
和 DELETE
操作的交易需要四个撤销日志的完整分配。一个仅执行 INSERT
操作的交易在常规表上需要一个撤销日志。
执行操作的交易从分配的撤销表空间回滚段中分配撤销日志。执行临时表操作的交易从全局临时表空间回滚段中分配撤销日志。
分配给交易的撤销日志将在交易的整个生命周期中保持附加状态。例如,分配给交易的撤销日志用于 INSERT
操作的常规表将用于该交易在常规表上的所有 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