回滚日志是与单个读写事务相关联的回滚日志记录的集合。回滚日志记录包含有关如何撤消事务对聚簇索引记录的最新更改的信息。如果另一个事务需要在一致性读取操作的一部分中查看原始数据,则未修改的数据将从回滚日志记录中检索。回滚日志存在于回滚日志段中,回滚日志段包含在回滚段中。回滚段驻留在回滚表空间和全局临时表空间中。
驻留在全局临时表空间中的回滚日志用于修改用户定义临时表中数据的事务。这些回滚日志没有进行重做日志记录,因为它们对于崩溃恢复不是必需的。它们仅在服务器运行时用于回滚。这种类型的回滚日志通过避免重做日志记录 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 |
一个事务最多分配四个回滚日志,每个操作类型一个
回滚日志按需分配。例如,执行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