undo的概况
mysql undo 是mvcc主要的实现环节。Undo记录默认备记录到系统表空间内,也可以使用单独的undo 表空间。
undo的结构
undo 使用 rollback segements管理;
手册下结构的描述:
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 InnoDB
前面32个是用于管理临时表事物,分配给临时表空间系统的。从32个开始是用于普通的segments,共96个
undo 支持的事务数取决于 回滚段中的撤消槽数和每个事务所需的撤消日志数。这个和inndodb page size相关
默认的是16k一个page
page size | number of undo slots |
---|---|
4k | 256 |
8k | 512 |
16k | 1024 |
32k | 2046 |
64k | 4096 |
从上表中可以看到 理论上普通事务支持的事务个数是96乘1024个
mysql undo 主要分别两大类:
1.insert_undo
2.update_undo(update,delete)
由于undo分类 这两类,所以如果需要估计undo支持的并发事务量
需要
(innodb_page_size / 16 / 2) * (innodb_rollback_segments - 32)
当然这受很多影响,这是其他不考虑的情况下,undo能支持的。
一些代码
这部分主要阅读了《数据库内核月报 - 2015 / 04 --MySQL · 引擎特性 · InnoDB undo log 漫游》
相关的定义在mysql-5.7.25\storage\innobase\include\trx0sys.h
mysql-5.7.25\storage\innobase\include\trx0rseg.h等
主要的定义:
参数:
trx0sys.h:
// 128 对于上面描述的128个回滚段 ()
#define TRX_SYS_N_RSEGS
//UNIV_PAGE_SIZE正常页面的大小 即 1024
#define TRX_RSEG_N_SLOTS (UNIV_PAGE_SIZE / 16)
主要结构体:
trx_sys_t 里面的 rseg_array是128,对应这128个回滚段
对应的trx_rseg_t , 再往下就是很多,trx_undo_t 是undo的 log的内存结构。
一条读写事务
从redo里面的一条insert中的btr_cur_ins_lock_and_undo 方法往下看,看能不能连起来。
trx_undo_report_row_operation ->方法
dberr_t