撤消日志是与单个读写事务关联的撤消日志记录的集合。撤消日志记录包含关于如何撤消事务对的最新更改的信息聚集索引记录。如果另一个事务需要将原始数据视为一致读操作的一部分,则从撤消日志记录检索未修改的数据。Undo日志存在于undo日志部分,它们包含在内部回滚段.回滚段驻留在撤消表空间而在全局临时表空间.
位于全局临时表空间中的Undo日志用于修改用户定义临时表中的数据的事务。这些撤消日志不会被重新记录,因为崩溃恢复不需要它们。它们仅用于服务器运行时的回滚。这种类型的撤销日志可以避免重做日志I/O,从而提高性能。
有关undo日志的静态数据加密的信息,请参见Undo日志加密.
每个undo表空间和全局临时表空间各自最多支持128个回滚段。的innodb_rollback_segments
变量定义回滚段的数量。
回滚段支持的事务数取决于回滚段中的撤消槽位数和每个事务所需的撤消日志数。回滚段中的undo槽位数目根据不同的实例而不同InnoDB
页面大小。
InnoDB页面大小 | 回滚段中Undo slot的个数(InnoDB Page Size / 16) |
---|---|
4096 (4 kb) |
256 |
8192 (8 kb) |
512 |
16384 (16 kb) |
1024 |
32768 (32 kb) |
2048 |
65536 (64 kb) |
4096 |
一个事务最多分配四个撤销日志,以下操作类型各一个:
根据需要分配Undo日志。例如,执行的事务插入
,更新
,删除
对常规表和临时表的操作需要分配四个撤销日志。只执行的事务插入
对常规表的操作需要一个撤消日志。
在常规表上执行操作的事务被分配来自指定的撤消表空间回滚段的撤消日志。对于执行临时表操作的事务,将从指定的全局临时表空间回滚段中分配undo日志。
分配给事务的撤消日志将在事务持续期间附加到该事务。例如,分配给事务的撤消日志插入
对普通表的操作用于所有插入
事务对常规表执行的操作。
根据上面描述的因素,可以使用以下公式估计并发读写事务的数量InnoDB
是能够支撑的。
在达到并发读写事务的数量之前,可能会遇到并发事务限制错误InnoDB
是能够支撑的。当分配给事务的回滚段用尽撤消槽位时,就会发生这种情况。在这种情况下,请尝试重新运行事务。
当事务对临时表执行操作时,并发读写事务的数量InnoDB
分配给全局临时表空间的回滚段的数量受到限制,默认为128。
如果每个事务执行
插入
或一个更新
或删除
操作时,表示并发读写事务的个数InnoDB
能够支撑的是:(innodb_page_size / 16) * innodb_rollback_segments * undo表空间的数量
如果每个事务执行一个
插入
而且一个更新
或删除
操作时,表示并发读写事务的个数InnoDB
能够支撑的是:(innodb_page_size / 16 / 2) * innodb_rollback_segments * undo tablespace的数量
如果每个事务执行一个
插入
操作临时表时,并发读写事务的个数即为InnoDB
能够支撑的是:(innodb_page_size / 16) * innodb_rollback_segments
如果每个事务执行一个
插入
而且一个更新
或删除
操作临时表时,并发读写事务的个数即为InnoDB
能够支撑的是:(innodb_page_size / 16 / 2) * innodb_rollback_segments