回滚日志
- 回滚日志是单独的读写事务相关联的回滚日志记录序列集合。一个回滚日志记录了如何回滚最后一个事务修改的聚集索引记录。如果另一事务的一致性读操作需要读该数据的原始信息,未被修改的数据可以从回滚日志记录中被提取出来。回滚日志存在于回滚日志段中,回滚日志段包含在回滚段中。回滚段会被存放在系统表空间,回滚表空间以及临时表空间中。
- 当事务中修改了用户自定义临时表的数据时,回滚日志会被存放在临时表空间中。这些回滚日志不会记录在重做日志,因为它们不需要故障恢复。它们只需要在服务启动过程中回滚。这种类型的回滚日志在性能上的好处是避免了重做日志的 I/O 开销。
- InnoDB 最大支持 128 个回滚段,其中 32 个会被分配到临时表空间。剩余的 96 个回滚段会被分配给常规表的修改事务使用。 innodb_rollback_segments 变量用来定义 InnoDB 中的回滚段的个数。
- 一个回滚段支持的事务个数,取决于回滚段中的回滚槽( undo slots )的个数以及每个事务需要的回滚日志个数。回滚段中回滚槽的个数的差异取决于 InnoDB 数据页大小。
InnoDB Page Size | Number of Undo Slots in a Rollback Setment(InnoDB Page Size / 16) |
---|---|
4096 (4KB) | 256 |
8192 (8KB) | 512 |
16384 (16KB) | 1024 |
32768 (32KB) | 2048 |
65536 (64KB) | 4096 |
- 一个事务最多可以分配给四种回滚日志,每个回滚日志属于下列一种类型:
- 用户自定义表的 INSERT 操作
- 用户自定义表的 UPDATE 以及 DELETE 操作
- 用户自定义临时表的 INSERT 操作
- 用户自定义临时表的 UPDATE 以及 DELETE 操作
- 回滚日志只有需要时才会被分配。比如:一个包括了在常规表和临时表进行插入,更新和删除操作的事务,需要将4个回滚日志都分配出来。只有插入常规表的事务只需要分配一个回滚日志。
- 在常规表上的事务操作分配的回滚日志来自系统表空间或者回滚表空间的回滚段。在临时表上的事务操作分配的回滚日志严重临时表空间上的回滚段。
- 回滚日志被分配的时间长短取决于它附加到的事务的时长。比如,回滚日志一个常规表的插入操作会持续整个事务对常规表插入操作的事务生命周期。
- 透过上述的因素,接下来的公式可以用于评估并发读写事务在 InnoDB 并发支持上的数量。
注意事项
一个并发事务有可能在达到 InnoDB 并发读写事务支持的最大数量前就报错。这个场景为:当事务的回滚段中的回滚槽数量不足时发生这类错误,此时可以尝试重新执行一次事务。 当事务操作在临时表上时,InnoDB 并发读写事务支持的数量是固定的,这个数值为临时表空间中回滚段支持的常量,即为32.
-
- 当事务操作为插入,更新或者删除中的一种,InnoDB 并行读写事务能力的数值为:
(innodb_page_size / 16) * (innodb_rollback_segments - 32)
- 当事务操作为插入与更新或者删除的组合时,InnoDB 并行读写事务能力的数值为:
(innodb_page_size / 16 / 2) * (innodb_rollback_segments - 32)
- 当事务操作为插入临时表时,更新或者删除中的一种,InnoDB 并行读写事务能力的数值为:
(innodb_page_size / 16) * 32
- 当事务操作为作用在临时表上的插入与更新或者删除的组合操作,更新或者删除中的一种,InnoDB 并行读写事务能力的数值为:
(innodb_page_size / 16 / 2) * 32
更多动态请关注微信公众号 dbagrant