1.介紹
Undolog是與單個讀寫事務相關聯的Undolog記錄的集合。
Undolog包含有關如何撤消事務對聚集索引記錄最新更改的信息。如果另一個事務需要將查看一致性讀的一部分原始數據,則會從Undolog記錄中檢索未修改的數據。
2.結構
Undolog記錄存在于Undolog段中
而Undolog段存在于回滾段中
回滾段存在于Undo表空間和全局臨時表空間中。
位于全局臨時表空間中的Undolog用于修改用戶定義的臨時表中的數據的事務。
這些Undo記錄不會被重新記錄,因為它們不是崩潰恢復所必需的。
它們僅用于服務器運行時的回滾。這種類型的undo日志避免了redo日志I/O,從而提高了性能。
有關undolog的靜態數據加密的信息,請參閱undolog加密。
2.1 回滾段和Undo槽(rollback segments和slots)
每個undo表空間和全局臨時表空間分別支持最多128個回滾段。
innodb_rollback_segments變量定義回滾段的數量。
回滾段支持的事務數取決于回滾段中撤消槽的數量以及每個事務所需的Undo日志的數量。
回滾段中撤消槽的數量因InnoDB頁面大小而異。
InnoDB 頁大小 | 回滾段中的Undo槽數量 (InnoDB頁大小 / 16) |
---|---|
4096 (4KB) | 256 |
8192 (8KB) | 512 |
16384 (16KB) | 1024 |
32768 (32KB) | 2048 |
65536 (64KB) | 4096 |
3.類型
一個事務最多分配四個Undolog,以下操作類型各分配一個:
對用戶定義表的INSERT操作
對用戶定義的表執行UPDATE和DELETE操作
對用戶定義的臨時表執行INSERT操作
對用戶定義的臨時表執行UPDATE和DELETE操作
根據需要分配Undolog。
例如,對常規表和臨時表執行INSERT、UPDATE和DELETE操作的事務需要完全分配四個Undolog。只對常規表執行INSERT操作的事務需要一個Undolog。
對常規表執行操作的事務從分配的Undolog表空間回滾段分配Undolog。對臨時表執行操作的事務從分配的全局臨時表空間回滾段分Undolog。
分配給事務的Undolog在其持續時間內保持附加到事務。
例如,為常規表上的INSERT操作分配給事務的Undolog將用于該事務在常規表上執行的所有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