1. 简介

  Undo Log包含了一系列在一个单独的事务中会产生的所有Undo Log记录。每一个Undo Log记录包含了如何undo事务对某一行修改的必要信息。InnoDB使用Undo Log来进行事务的回滚和MVCC机制。在逻辑存储上,Undo Log位于Undo Log 段中,后者位于回滚段(roll back segments)中。在目前的最新版本中,会馆段不仅仅可以位于系统表空间(例如data目录下面的ibdata1文件就是一个系统表空间)、临时表空间,也可以通过配置放置到undo 表空间中。InnoDB支持128个回滚段,其中32个用于临时表的事务。剩下的96个,每一个支持1023个并发数据修改事务。

  2. Undo Log物理结构

  Undo Log的物理结构可以直接参照博文 :

  http://insidemysql.blog.163.com/blog/static/2028340422013325115250722/

  http://insidemysql.blog.163.com/blog/static/202834042201341011347494/

  其中有两个疑惑点:

  一是第二篇博文中 UPDATE t SET c=2 WHERE a=1; 语句的说明中,写道:列的值(a=1),我认为是作者的笔误,应该是 c=1;

  二是 80 00 01这是表示值为1,这里应该是InnoDB特殊处理了(猜测,可能是1开始表示为正数),作者说80 00 01表示为1是因为计算机中存储的是有符号整数,但是1的有符号int表示形式应该是 00 00 01。

  3.Undo Log逻辑内容

  光看Undo Log的物理结构可能有点不好理解,这里讲解一下自己的理解。考虑下面这样的一些SQL。

CREATE TABLE my_tb(
id int auto_increment,
name varchar(255) not null,
sex varchar(255) not null,
primary key(id),
key(name)
) #事务一开始 插入一条数据 假设id=1 提交
BEGIN;
INSERT INTO my_tb(name,sex) values('a','boy');
COMMIT; #事务二开始 删除操作 不提交
BEGIN;
DELETE FROM my_tb WHERE id=1;
#回滚不提交
ROLLBACK; #事务三开始 更新操作
BEGIN;
UPDATE my_tb set name='b' where id=1;

  事务一在提交之前,会有一条这样子的Undo Log:

  插入了一条id=1的记录 。

  是的,插入语句中的undo log只会记录 unique key(应该包括主键和所有的唯一键,猜测未证实,主键肯定是有的),而不包括其他字段的信息。

  事务二提交之前,会有一条这样子的Undo Log:

  删除了一条id=1的记录,他的name为a,他的sex为boy。

  这时候不仅仅会记录主键,也会记录所有字段的值。

  事务三提交之前,会有一条这样子的Undo Log:

  更新了一条id=1的记录,他的name为a。

  注意这时候记录的name不是b,而是a。

  为什么Undo Log翻译过来是这样子的?其实思考一下Undo Log是用来做什么的就知道了。Undo Log被用于回滚和MVCC,两者都需要恢复或者获取到之前版本的信息。

  如果你插入了一条数据,通过插入数据的Undo Log中唯一索引字段和值查找到对应的记录,然后进行删除(回滚时)或者忽略(MVCC);

  如果你更新了了一条数据,找到对应的记录之后,通过记录的原始值(name='a')恢复成原来的记录;

  如果你删除了一条数据,那么就需要完整的记录信息,才能进行回滚和恢复。

  当然,Undo Log中记录的信息不像我说的这么简单,具体的信息还是查看上面的两篇博文,从物理结构中理解Undo Log。另外,Undo Log中提供的信息其实不是完整的,如果你的系统故障,导致已经提交的事务涉及的记录没有刷新到磁盘而丢失更新,这时候就需要redo log和 double write buffer一起配合进行恢复了。

InnoDB Undo Log的更多相关文章

  1. InnoDB undo log物理结构的初始化

    水平有限,如果有误请指出.一直以来未对Innodb 的undo进行好好的学习,最近刚好有点时间准备学习一下,通过阿里内核月报和自己看代码的综合总结一下.本文环境: 代码版本 percona 5.7.2 ...

  2. 14.5.7 Storing InnoDB Undo Logs in Separate Tablespaces 存储InnoDB Undo logs 到单独的表空间

    14.5.7 Storing InnoDB Undo Logs in Separate Tablespaces 存储InnoDB Undo logs 到单独的表空间 在MySQL 5.6.3,你可以存 ...

  3. 日志:Redo Log 和 Undo Log

    本篇文章主要介绍 Redo Log 和 Undo Log: 利用 Redo Log 和 Undo Log 实现本地事务的原子性.持久性 Redo Log 的写回策略 Redo Log Buffer 的 ...

  4. InnoDB事务日志(redo log 和 undo log)详解

    数据库通常借助日志来实现事务,常见的有undo log.redo log,undo/redo log都能保证事务特性,undolog实现事务原子性,redolog实现事务的持久性. 为了最大程度避免数 ...

  5. 【msql】关于redo 和 undo log

    InnoDB 有两块非常重要的日志,一个是undo log,另外一个是redo log,前者用来保证事务的原子性以及InnoDB的MVCC,后者用来保证事务的持久性.和大多数关系型数据库一样,Inno ...

  6. 14.2.4 InnoDB Undo Logs

    14.2.4 InnoDB Undo Logs : 一个Undo log (或者成为回滚段) 是一个存储区域 持有被活动事务修改的数据的copy. 如果另外的事务需要看原始的数据(作为一致性读操作的一 ...

  7. 说说MySQL中的Redo log Undo log都在干啥

        在数据库系统中,既有存放数据的文件,也有存放日志的文件.日志在内存中也是有缓存Log buffer,也有磁盘文件log file,本文主要描述存放日志的文件.     MySQL中的日志文件, ...

  8. 5分钟了解MySQL5.7的undo log在线收缩新特性

    Part1:写在最前 在MysQL5.6版本中,可以把undo log 回滚日志分离到一个单独的表空间里:其缺点是不能回收空间大小,until MysQL5.7,but MariadDB10.1暂不支 ...

  9. 数据库原理 - 序列5 - 事务是如何实现的? - Undo Log解析

    本文节选自作者书籍<软件架构设计:大型网站技术架构与业务架构融合之道>.作者微信公众号:架构之道与术.公众号底部菜单有书友群可以加入,与作者和其他读者进行深入讨论.也可以在京东.天猫上购买 ...

随机推荐

  1. Flask01 初识flask、flask配置

    1 什么是flask Flask是一个使用 Python 编写的轻量级 Web 应用框架.其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 . 百度百科:点击前往 中文文档: ...

  2. Redis[三] @Hash 哈希

    Redis的哈希值是字符串字段和字符串值之间的映射,所以他们是表示对象的完美数据类型 在Redis中的哈希值,可存储超过400十亿键值对. redis 提供了2套操纵 一种是批量 一种是非批量 假设需 ...

  3. TC358775XBG:MIPI DSI转双路LVDS芯片简介

    TC358775XBG是一颗MIPI DSI转双路LVDS芯片,通信方式:IIC/MIPI command mode,分辨率1920*1200,封装形式:BGA64.

  4. 原创: rsync软件服务利用ansible实现一键化部署

    ---恢复内容开始--- 首先创建一个脚本文件 /server/tools/peizhi.sh cat  /server/tools/peizhi.sh cat >>/etc/rsyncd ...

  5. Maven简述

    一.前言     以前做过的项目中,没有真正的使用过Maven,只知道其名声很大,其作用是用来管理jar 包的.最近一段时间在项目过程中使用Maven,用Maven构建的web项目,其项目结构只停留在 ...

  6. 《个人-GIT使用方法》

    使用GIT版本控制工具及基本使用方法(安装,新建,推送,拉取),托管平台的使用方法. Git 常用命令 git init here -- 创建本地仓库(repository),将会在文件夹下创建一个 ...

  7. ASP.NET Core的身份认证框架IdentityServer4(8)- 使用密码认证方式控制API访问

    前言 本文及IdentityServer这个系列使用的都是基于.net core 2.0的.上一篇博文在API项目中我使用了icrosoft.AspNetCore.Authentication.Jwt ...

  8. Linux Centos 6.9中SSH默认端口修改的坑

    关于Linux Centos6.5的SSH默认端口修改的博客有一大堆,我在这里就不啰嗦了,但是面对Centos 6.9,就会发现有一个巨坑: 修改iptables之后执行下面的命令后: # servi ...

  9. JS自定义对象以及相关成绩系统完整案例演示

    [自定义对象] 1.基本概念 ①对象是拥有一系列无无序属性和方法的集合 ②键值对:对象中的数据,用以键值对的形式存在,对象的每个属性和方法,都对应一个键值,以键取值 ③属性:描述对象特征的一系列变量称 ...

  10. HTML5新增web存储方式

    客户端存储数据的两个对象为: 两个对象在使用方式没有任何区别,唯一的不同点蚀储存数据 的有效时间 ①localStorage - 没有时间限制的数据存储 除非手动删除,否则数据将一直保存在本地文件: ...