UNDO日志

Wesley13
• 阅读 399

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 undo

undo日志段

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日志

  • 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日志

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

tips;

  • 一个undo log是由很多undo log record组成,因为一个undo包含很多记录
  • insert和update两种undo处理方式不一样,存放在不同段里面,是因为undo的回收对于insert操作,只要被插入了就可以被回收,而update操作,即使事物提交了,这个undo也不能马上被回收(mvcc详见下节分析)
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这