InnoDB Undo Log
- 简介
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的更多相关文章
- InnoDB undo log物理结构的初始化
水平有限,如果有误请指出.一直以来未对Innodb 的undo进行好好的学习,最近刚好有点时间准备学习一下,通过阿里内核月报和自己看代码的综合总结一下.本文环境: 代码版本 percona 5.7.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,你可以存 ...
- 日志:Redo Log 和 Undo Log
本篇文章主要介绍 Redo Log 和 Undo Log: 利用 Redo Log 和 Undo Log 实现本地事务的原子性.持久性 Redo Log 的写回策略 Redo Log Buffer 的 ...
- InnoDB事务日志(redo log 和 undo log)详解
数据库通常借助日志来实现事务,常见的有undo log.redo log,undo/redo log都能保证事务特性,undolog实现事务原子性,redolog实现事务的持久性. 为了最大程度避免数 ...
- 【msql】关于redo 和 undo log
InnoDB 有两块非常重要的日志,一个是undo log,另外一个是redo log,前者用来保证事务的原子性以及InnoDB的MVCC,后者用来保证事务的持久性.和大多数关系型数据库一样,Inno ...
- 14.2.4 InnoDB Undo Logs
14.2.4 InnoDB Undo Logs : 一个Undo log (或者成为回滚段) 是一个存储区域 持有被活动事务修改的数据的copy. 如果另外的事务需要看原始的数据(作为一致性读操作的一 ...
- 说说MySQL中的Redo log Undo log都在干啥
在数据库系统中,既有存放数据的文件,也有存放日志的文件.日志在内存中也是有缓存Log buffer,也有磁盘文件log file,本文主要描述存放日志的文件. MySQL中的日志文件, ...
- 5分钟了解MySQL5.7的undo log在线收缩新特性
Part1:写在最前 在MysQL5.6版本中,可以把undo log 回滚日志分离到一个单独的表空间里:其缺点是不能回收空间大小,until MysQL5.7,but MariadDB10.1暂不支 ...
- 数据库原理 - 序列5 - 事务是如何实现的? - Undo Log解析
本文节选自作者书籍<软件架构设计:大型网站技术架构与业务架构融合之道>.作者微信公众号:架构之道与术.公众号底部菜单有书友群可以加入,与作者和其他读者进行深入讨论.也可以在京东.天猫上购买 ...
随机推荐
- jquery的2.0.3版本源码系列(2):21行-94行定义了一些变量和函数 jQuery=function(){}
2.1.bug通过索引查询 这里的#13335是bug的索引,如何查询呢? 第一步,浏览器地址栏输入"https://bugs.jquery.com/". 第二步,在网页的搜索框里 ...
- JS中的循环结构
[循环结构的执行步骤]1.声明循环变量:2.判断循环条件3.执行循环体操作4.更新循环变量然后循环执行2-4,直到条件不成立时,跳出循环.while循环()中的表达式,运算结果可以是各种类型,但是最终 ...
- Java基础---String类和基本数据类型包装类
第一讲 String类 一.概述 String是字符串的类类型,用于描述字符串事物.字符串是一个特殊的对象.特殊之处就在于: Stings= new String();和Str ...
- python进阶学习(二)
本节学习图形用户界面 ------------------------ 本节介绍如何创建python程序的图形用户界面(GUI),也就是那些带有按钮和文本框的窗口.这里介绍wxPython : 下载地 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(86)-日程管理-fullcalendar插件用法
前言 本文分享fullcalendar用法,最后面提供代码下载 说到日程管理,基于JQuery的插件FullCalendar当之无愧,完整的API稳定和调用方式,非常易于扩展!可以用于系统的个人历程管 ...
- 浅谈JS的继承
JS继承 继承是OO语言中最为人津津乐道的概念,许多OO语言都支持两种方式的继承:接口继承:实现继承. 接口继承:只继承方法签名. 实现继承:继承实际的方法. 由于ES里函数没有签名,所以在ES里面无 ...
- 用PyCharm执行测试成功但无法生成HTMLTestRunner报告
问题:代码写的没问题,执行也成功了,但就是无法生成HTMLTestRunner的报告 其实这是编辑器搞得鬼,编辑器为了方便用户执行测试,都有一项功能,可以用编辑器来调用unittest或者nose来执 ...
- 融会贯通——最常用的“合成复用原则”技能点Get
复用一个类的时候,多使用对象的组合/聚合的关联关系,而不是继承. 之前提到的"依赖倒转原则",是以里氏代换原则为基础的实现开闭原则目标的手段,这一条路线涉及到的是类的继承(包括单继 ...
- 主从及转发DNS搭建
author:JevonWei 版权声明:原创作品 主DNS 安装bind软件包 yum -y install bind systemctl start named systemctl enable ...
- ios 初体验<页面切换>
本章类容:介绍如何新建一个页面,打开另一个页面 1.在前面中,在工程Appdelegate.m 里面程序第一个走的方法,新建一个窗口,视图,控制器,可视化等, 2.然后在ViewController. ...