UNDO日志

摘要:
撤销日志记录的内容是逻辑的(基于每个记录),重做日志记录是物理的(基于页面),回滚是逻辑回滚innodb_undo_Tablespaces 5.6可以将撤销设置为多个表空间innodb_ undo_可以设置多少撤销日志?默认情况下,128和5.7是96。前32个是为临时表(ibtmp1)保留的。事实上,这并不重要。我通常不使用UNDO对象。从底层来看,它是非常复杂的对象

undo log记录的内容是逻辑的(基于每条记录),redo log记录的是物理的(基于page),rollback是逻辑上的回滚

innodb_undo_tablespaces    5.6可以将undo设为多个表空间
innodb_undo_logs           可以设置有多少个undo,默认128,5.7是96,前面32个留给临时表(ibtmp1),其实也无所谓,通常用不到

Ⅰ、UNDO对象

从底层来看非常复杂

对象说明
rollback segment回滚段
undo log segment undoundo日志段
undo page组成了undo日志段
undo log存在于undo page中
undo log record存在于undo log中

上面这个太底层,这里只分析回滚段和undo log内容,其他自己看书

1.1 rollback segment(回滚段)

  • 5.5之前只有1个rollback segment
  • 5.5之后有128个
  • 不保存任何undo log,只保存undo log segment的位置
  • 含有1024个undo slot
   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线程

1.2 undo log的保存

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)使用

1.3 undo log的内容

UNDO日志第1张

  • undo log header

  • undo log records(两种)

    1、insert undo log record 记录insert

    2、update undo log record, 记录update和delete(trx_undo_upd_exist_rec,trx_undo_del_mark_rec,trx_undo_upd_del_rec)

undo是逻辑日志,记录了每一行修改的值(前后项)

UNDO日志第2张

之前说的redo写prepare,就是把上图中红色框框部分修改为prepare状态(redo记录页的变化,undo也是一种页)

tips;

  • 一个undo log是由很多undo log record组成,因为一个undo包含很多记录
  • insert和update两种undo处理方式不一样,存放在不同段里面,是因为undo的回收对于insert操作,只要被插入了就可以被回收,而update操作,即使事物提交了,这个undo也不能马上被回收(mvcc详见下节分析)

免责声明:文章转载自《UNDO日志》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇VS2019 开发AngularJS(TypeScript)代码缩进处理C#开发Android应用实战 读后感下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Emacs的undo与redo

在Emacs的手册16.1节中有这样一句话, Any command other than an undo command breaks the sequence of undo commands. Starting from that moment, the entire sequence of undo commands that you have j...

查询语句有 or 会导致查询速度变慢问题解决

先上查询语句 select u.c_user_id 用户编号, u.c_old_user_id 旧编号, u.c_user_name 用户名称, u.c_user_address 用户地址, 日志说明 日志说明, 操作人 操作人,...

nginx查看日志

nginx的log日志分为access log 和 error log 其中access log 记录了哪些用户,哪些页面以及用户浏览器、ip和其他的访问信息 error log 则是记录服务器错误日志 错误日志的形式如下: 10.1.1.1 - - [22/Aug/2014:16:48:14 +0800] "POST /ajax/MbpRequest.d...

注解@Slf4j

如果不想每次都写private final Logger logger = LoggerFactory.getLogger(XXX.class); 可以用注解@Slf4j 一、在pom文件加入依赖 <dependency><groupId>org.projectlombok</groupId><artifactId...

内存不足引起的SIGKILL:一个缓冲区不断增长问题的定位与解决(解释SIGKILL原因)

新版本的录制程序终于快完工了,在添加了一个新特性“报警录制”后,就开始测试了。 一开始就不顺利:程序正常运行一段时间后就会崩溃,由于程序添加了守护进程,在崩溃后会自动重启。 因此测试得到的结果就是:程序运行一段时间后就自动重启,并不断持续;有时几个小时重启一次,有时甚至每分钟都重启。 废话少说,开始定位问题: 1.去掉自动重启功能,在gdb下运行,...

火狐的调试利器Firebug

每次分享例会同事的分享都会让我学习到很多知识,因为我的基础比较差。所以对很多东西都不熟悉。     今天的分享例会主题是关于Firebug的运用,或许对很多同事来说,这些都不是新知识,但是对我来说我必须得好好总结一下今天所学的知识。     1.什么是Firebug:     Firebug 是网页浏览器 Mozilla Firefox 下的一款开发类插...