14.6.7 Undo Logs
An undo log is a collection of undo log records associated with a single read-write transaction. An undo log record contains information about how to undo the latest change by a transaction to a clustered index record. If another transaction needs to see the original data as part of a consistent read operation, the unmodified data is retrieved from undo log records. Undo logs exist within undo log segments, which are contained within rollback segments. Rollback segments reside in the system tablespace, in undo tablespaces, and in the temporary tablespace.
Undo logs that reside in the temporary tablespace are used for transactions that modify data in user-defined temporary tables. These undo logs are not redo-logged, as they are not required for crash recovery. They are used only for rollback while the server is running. This type of undo log benefits performance by avoiding redo logging I/O.
InnoDB supports a maximum of 128 rollback segments, 32 of which are allocated to the temporary tablespace. This leaves 96 rollback segments that can be assigned to transactions that modify data in regular tables. The
innodb_rollback_segments variable defines the number of rollback segments used by
The number of transactions that a rollback segment supports depends on the number of undo slots in the rollback segment and the number of undo logs required by each transaction.
The number of undo slots in a rollback segment differs according to
InnoDB page size.
|InnoDB Page Size||Number of Undo Slots in a Rollback Segment (InnoDB Page Size / 16)|
A transaction is assigned up to four undo logs, one for each of the following operation types:
Undo logs are assigned as needed. For example, a transaction that performs
DELETE operations on regular and temporary tables requires a full assignment of four undo logs. A transaction that performs only
INSERT operations on regular tables requires a single undo log.
A transaction that performs operations on regular tables is assigned undo logs from an assigned system tablespace or undo tablespace rollback segment. A transaction that performs operations on temporary tables is assigned undo logs from an assigned temporary tablespace rollback segment.
An undo log assigned to a transaction remains tied to the transaction for its duration. For example, an undo log assigned to a transaction for an
INSERT operation on a regular table is used for all
INSERT operations on regular tables performed by that transaction.
Given the factors described above, the following formulas can be used to estimate the number of concurrent read-write transactions that
InnoDB is capable of supporting.
A transaction can encounter a concurrent transaction limit error before reaching the number of concurrent read-write transactions that
InnoDB is capable of supporting. This occurs when the rollback segment assigned to a transaction runs out of undo slots. In such cases, try rerunning the transaction.
When transactions perform operations on temporary tables, the number of concurrent read-write transactions that
InnoDB is capable of supporting is constrained by the number of rollback segments allocated to the temporary tablespace, which is 32.
(innodb_page_size / 16) * (innodb_rollback_segments - 32)
(innodb_page_size / 16 / 2) * (innodb_rollback_segments - 32)
If each transaction performs an
INSERToperation on a temporary table, the number of concurrent read-write transactions that
InnoDBis capable of supporting is:
(innodb_page_size / 16) * 32
(innodb_page_size / 16 / 2) * 32