undo log记录的内容是逻辑的(基于每条记录),redo log记录的是物理的(基于page),rollback是逻辑上的回滚并发
innodb_undo_tablespaces 5.6能够将undo设为多个表空间 innodb_undo_logs 能够设置有多少个undo,默认128,5.7是96,前面32个留给临时表(ibtmp1),其实也无所谓,一般用不到
从底层来看很是复杂mvc
对象 | 说明 |
---|---|
rollback segment | 回滚段 |
undo log segment undo | undo日志段 |
undo page | 组成了undo日志段 |
undo log | 存在于undo page中 |
undo log record | 存在于undo log中 |
上面这个太底层,这里只分析回滚段和undo log内容,其余本身看书spa
Rollback undo log Segment segment +-----------+ +---------+ +------+ | segment 1 | | 1 +------------> undo | +-----------+ +---------+ +------+ | segment 2 +------------> 2 | +-----------+ +---------+ | segment 3 | | ... | +-----------+ +---------+ +------+ | | | 1024 +------------> undo | | . | +---------+ +------+ | . | | . | | | +-----------+ | segment127| +-----------+ | segment128| +-----------+
5.5只有一个rollback segment,即只有1024个undo log segment,就表示只能有1024个并发事务(线程)去执行undo 若是用不到undo,其实能够超过1024个线程 在5.6中支持128*1024个并发执行undo线程
undo默认保存在ibdata,即系统表空间中线程
再回顾下,ibdata1中有哪些东西?日志
double Write 元数据信息(数据字典) undo信息(5.6后可分离),分开放可避免竞争 innodb_undo_directory innodb_undo_logs innodb_undo_tablespaces insert buffer/change buffer 在MySQL5.7之后,Rollback Segment从128个小到96个,剩余的32个rollback segment预留给临时表空间(ibtmp1)使用
undo log records(两种)code
一、insert undo log record 记录insert对象
二、update undo log record, 记录update和delete(trx_undo_upd_exist_rec,trx_undo_del_mark_rec,trx_undo_upd_del_rec)blog
undo是逻辑日志,记录了每一行修改的值(先后项)事务
以前说的redo写prepare,就是把上图中红色框框部分修改成prepare状态(redo记录页的变化,undo也是一种页)ip
tips;