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解析
本文节选自作者书籍<软件架构设计:大型网站技术架构与业务架构融合之道>.作者微信公众号:架构之道与术.公众号底部菜单有书友群可以加入,与作者和其他读者进行深入讨论.也可以在京东.天猫上购买 ...
随机推荐
- Linux企业运维人员最常用150个命令汇总
命令 功能说明 线上查询及帮助命令(2个) man 查看命令帮助,命令的词典,更复杂的还有info,但不常用. help 查看Linux内置命令的帮助,比如cd命令. 文件和目录操作命令(18个) l ...
- [2015-10-11]常用git命令
从vs2013开始,vs已经对git的操作提供了很好的支持,但是重度使用时还是会遇到很多抽风的时候,在此记录一些常用命令. 分支操作 查看所有远程分支 git branch -r 查看本地分支 git ...
- css中使用变量
2017年3月,微软宣布 Edge 浏览器将支持 CSS 变量.这个重要的 CSS 新功能,所有主要浏览器已经都支持了. 声明css变量的时候,变量名前面要加两根连词线(--).变量名大小写敏感,-- ...
- vue2+swiper(用户操作swiper后,不能autoplay了)
将autoplayDisableOnInteraction设置为false
- django 5 form1
---------------------Form表单验证(用户请求验证+生成HTML标签) 示例:用户管理 a. 添加用户页面 - 显示HTML标签 - 提交:数据验证 - 成功之后保存 - 错误显 ...
- 编辑sass报错:error style.scss (Line 3: Invalid GBK character "\xE5")解决办法
cmd.exe /D /C call C:/Ruby23-x64/bin/scss.bat --no-cache --update header.scss:header.css error heade ...
- 一些LVS实验配置、工具和方案
最近做了一些LVS配置和方案的验证实验,将过程中用到的一些配置.工具和具体的解决方案记录一下.使用DR模式.验证一种不中断业务的RealServer升级或者重启方案. 网络规划: 节点 IP地址 ce ...
- 团队作业8——Beta 阶段冲刺3rd day
一.当天站立式会议 二.每个人的工作 (1)昨天已完成的工作(具体在表格中) 添加了订单功能,并且对订单功能进行了测试 (2)今天计划完成的工作(具体如下) 添加支付功能 (3) 工作中遇到的困难(在 ...
- 【Alpha】 第七次Daily Scrum Meeting
一.本次会议为第七次meeting会议 二.时间:9:37AM-9:50AM 地点:禹州三楼 三.会议站立式照片 四.今日任务 成员 昨日任务 今日任务 林清青 学习并了解微信程序相关方面知识,为小组 ...
- 201521123099 《Java程序设计》第6周学习总结
1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...