MySQL日志之Undo日志
Undo日志
redo log是事务持久性的保证
,undo log是事务原子性的保证
。在事务中 更新数据 的 前置操作 其实是要先写入一个 undo log
。
如何理解Undo日志
事务需要保证 原子性
,也就是事务中的操作要么全部完成,要么什么也不做。但有时候事务执行到一半
会出现一些情况,比如:
- 情况一:事务执行过程中可能遇到各种错误,比如 服务器本身的错误 , 操作系统错误 ,甚至是突
然 断电 导致的错误 - 情况二:程序员可以在事务执行过程中手动输入 ROLLBACK 语句结束当前事务的执行。
以上情况出现,我们需要把数据改回原先的样子,这个过程称之为 回滚
,这样就可以造成一个假象:这个事务看起来什么都没做,所以符合 原子性 要求。
Undo日志的作用
- 回滚数据
1)用户对undo日志可能有误解:undo用于将数据库物理地恢复到执行语句或事务之前的样子。但事实并非如此。undo是逻辑日志,因此只是将数据库逻辑地恢复到原来的样子
。所有修改都被逻辑地取消了,但是数据结构和页本身在回滚之后可能大不相同。
2)这是因为在多用户并发系统中,可能会有数十、数百甚至数千个并发事务。数据库的主要任务就是协调对数据记录的并发访问。比如,一个事务在修改当前一个页中某几条记录,同时还有别的事务在对同一个页中另几条记录进行修改。因此,不能将一个页回滚到事务开始的样子,因为这样会影响其他事务正在进行的工作。 - MVCC
1)undo的另一个作用是MVCC,即在InnoDB存储引擎中MNCc的实现是通过undo来完成。当用户读取一行记录时,若该记录已经被其他事务占用,当前事务可以通过undo读取之前的行版本信息,以此实现非锁定读取。
Undo的存储结构
- 回滚段与undo页
InnoDB对undo log的管理采用段的方式,也就是 回滚段(rollback segment) 。每个回滚段记录了1024 个 undo log segment ,而在每个undo log segment段中进行 undo页 的申请。 - 回滚段与事务
1) 每个事务只会使用一个回滚段,一个回滚段在同一时刻可能会服务于多个事务。
2)当一个事务开始的时候,会制定一个回滚段,在事务进行的过程中,当数据被修改时,原始的数据会被复制到回滚段。
3)在回滚段中,事务会不断填充盘区,直到事务结束或所有的空间被用完。如果当前的盘区不够用,事务会在段中请求扩展下一个盘区,如果所有已分配的盘区都被用完,事务会覆盖最初的盘区或者在回滚段允许的情况下扩展新的盘区来使用。
4) 回滚段存在于undo表空间中,在数据库中可以存在多个undo表空间,但同一时刻只能使用一个undo表空间。
5) 当事务提交时,InnoDB存储引擎会做以下两件事情:将undo log放入列表中,以供之后的purge操作;判断undo log所在的页是否可以重用,若可以分配给下个事务使用
回滚段中的数据分类
- 未提交的回滚数据(uncommitted undo information)
- 已经提交但未过期的回滚数据(committed undo information)
- 事务已经提交并过期的数据(expired undo information)
Undo的工作过程
Undo log的删除
- 针对于insert undo log
因为insert操作的记录,只对事务本身可见,对其他事务不可见。故该undo log可以在事务提交后直接删除,不需要进行purge操作 - 针对于update undo log
该undo log可能需要提供MVCC机制,因此不能在事务提交时就进行删除。提交时放入undo log链表,等待purge线程进行最后的删除
总结
- undo log是逻辑日志,对事务回滚时,只是将数据库逻辑地恢复到原来的样子。
- redo log是物理日志,记录的是数据页的物理变化,undo log不是redo log的逆过程
MySQL日志之Undo日志相关推荐
- 【MySql进阶】undo日志详解:undo日志结构、undo日志链表、回滚段、undo log原理
undo日志 本文为阅读<MySql是怎样运行的>的笔记,供大家参考. 文章目录 undo日志 概述 undo日志数据结构 insert 对应的undo log delete 对应的und ...
- MySQL undo日志
MySQL知识总结 <MySQL是怎样运行的>知识总结 单表访问方法 表的连接原理 优化 基于查询成本的优化 优化需要的统计数据 优化 基于规则的优化 Explain详解 InnoDB缓冲 ...
- mininet编程实现交换机规则的插入、删除与修改。_Mysql闲聊之从Redo、Undo日志到MVCC实现原理
文章大纲 Undo日志 Redo日志 MVCC Undo 日志 关系型数据需要实现事务的 ACID 特性,其中一点就是事务的原子性,Mysql 就是通过 Undo 日志就来实现的. 数据库处理数据都是 ...
- MySQL中的重做日志(redo log),回滚日志(undo log),以及二进制日志(binlog)的简单总结...
MySQL中有六种日志文件, 分别是:重做日志(redo log).回滚日志(undo log).二进制日志(binlog).错误日志(errorlog).慢查询日志(slow query log). ...
- MySQL中的重做日志(redo log),回滚日志(undo log),以及二进制日志(binlog)的简单总结
前言 1. ''最近公司大佬让我优化sql的时候,说可以通过控制where条件,尽可能的少的较少数据库的开支,少生成一些无用的binlog.由此引出binlog这个概念,大家一起学习一下 关于Binl ...
- 【转】【MySQL】运行原理(四):重做日志(redo log),回滚日志(undo log),二进制日志(binlog)
MySQL中有六种日志文件,分别是:重做日志(redo log).回滚日志(undo log).二进制日志(binlog).错误日志(errorlog).慢查询日志(slow query log).一 ...
- mysql重做日志与binlog日志区别_MySQL中的重做日志(redo log),回滚日志(undo log),以及二进制日志(binlog)的简单总结...
MySQL中有六种日志文件,分别是 重做日志(redo log) 回滚日志(undo log) 二进制日志(binlog) 错误日志(errorlog) 慢查询日志(slow query log) 一 ...
- mysql数据库undo日志恢复_MySQL的undo/redo日志和binlog日志,以及2PC
发现自己的知识点有点散,今天就把它们连接起来,好好总结一下. 一.undo log.redo log.binlog的定义和对比 定义和作用 所在架构层级 日志形式 所在文件和默认名称,组织结构 是否缓 ...
- Mysql——Undo日志
回顾与简介 lnnoDB 的更新操作采用的是 Write Ahead Log(预先日志持久化)策略,即先写日志,再写入磁盘 redo log是事务持久性的保证,undo log是事务原子性的保证.在事 ...
- MySQL怎么运行的系列(八)14张图说明白MySQL事务原子性和undo日志原理
本系列文章目录 展开/收起 MySQL怎么运行的系列(一)mysql体系结构和存储引擎 MySQL怎么运行的系列(二)Innodb缓冲池 buffer pool 和 改良版LRU算法 Mysql怎么运 ...
最新文章
- 数组、ArrayList、链表、LinkedList
- 第十四章 架构师领导艺术(待续)
- Java 8 - 04 类型检查、类型推断以及限制
- 使用C# lock同时访问共享数据
- python对象继承
- ASP.NET Web API 安全筛选器
- 构建SpringCloud项目基础框架
- java输入做参数需要close吗_JAX-RS和java.time.LocalDate作为输入参数
- 学习ios,看到下面的博客感觉收获很大
- 如何编写测试用例(入职测开感想)
- python报数组越界_【问题汇总】列表数组越界的问题
- Spark中 RDD之coalesce与repartition区别
- Docker之数据卷和数据卷容器
- 某学院软件工程复试回忆总结
- python 赚钱 知乎_2020年,小红书、知乎与B站谁能赚钱?
- python一键分类文件夹下的文件音乐
- 设计模式六大原则(3):里氏替换原则
- 读吴军博士新浪微博(2012.09-2014.12)信息整理
- XSS攻击的一个校内简单实例
- 十二星座匹配对象_来看十二星座最配与最不配的对象是谁