MySQL回滚日志(undo log)总结
目录
一、undo log的概念
二、undo log的作用
三、undo log的存储机制
四、undo log的工作原理
五、undo log的相关参数
附录:参考资料
一、undo log的概念
undo log是mysql中比较重要的事务日志之一,顾名思义,undo log是一种用于撤销回退的日志,在事务没提交之前,MySQL会先记录更新前的数据到 undo log日志文件里面,当事务回滚时或者数据库崩溃时,可以利用 undo log来进行回退。
二、undo log的作用
在MySQL中,undo log日志的作用主要有两个:
- 1、提供回滚操作【undo log实现事务的原子性】
我们在进行数据更新操作的时候,不仅会记录redo log,还会记录undo log,如果因为某些原因导致事务回滚,那么这个时候MySQL就要执行回滚(rollback)操作,利用undo log将数据恢复到事务开始之前的状态。
如我们执行下面一条删除语句:
delete from user where id = 1;
那么此时undo log会记录一条对应的insert 语句【反向操作的语句】,以保证在事务回滚时,将数据还原回去。
再比如我们执行一条update语句:
update user set name = "李四" where id = 1; ---修改之前name=张三
此时undo log会记录一条相反的update语句,如下:
update user set name = "张三" where id = 1;
如果这个修改出现异常,可以使用undo log日志来实现回滚操作,以保证事务的一致性。
- 2、提供多版本控制(MVCC)【undo log实现多版本并发控制(MVCC)】
MVCC,即多版本控制。在MySQL数据库InnoDB存储引擎中,用undo Log来实现多版本并发控制(MVCC)。当读取的某一行被其他事务锁定时,它可以从undo log中分析出该行记录以前的数据版本是怎样的,从而让用户能够读取到当前事务操作之前的数据【快照读】。
下面解释一下什么是快照读,与之对应的还有一个是---当前读。
快照读:
SQL读取的数据是快照版本【可见版本】,也就是历史版本,不用加锁,普通的SELECT就是快照读。
当前读:
SQL读取的数据是最新版本。通过锁机制来保证读取的数据无法通过其他事务进行修改UPDATE、DELETE、INSERT、SELECT … LOCK IN SHARE MODE、SELECT … FOR UPDATE都是当前读。
三、undo log的存储机制
undo log的存储由InnoDB存储引擎实现,数据保存在InnoDB的数据文件中。在InnoDB存储引擎中,undo log是采用分段(segment)的方式进行存储的。rollback segment称为回滚段,每个回滚段中有1024个undo log segment。在MySQL5.5之前,只支持1个rollback segment,也就是只能记录1024个undo操作。在MySQL5.5之后,可以支持128个rollback segment,分别从resg slot0 - resg slot127,每一个resg slot,也就是每一个回滚段,内部由1024个undo segment 组成,即总共可以记录128 * 1024个undo操作。
下面以一张图来说明undo log日志里面到底存了哪些信息?
如上图,可以看到,undo log日志里面不仅存放着数据更新前的记录,还记录着RowID、事务ID、回滚指针。其中事务ID每次递增,回滚指针第一次如果是insert语句的话,回滚指针为NULL,第二次update之后的undo log的回滚指针就会指向刚刚那一条undo log日志,依次类推,就会形成一条undo log的回滚链,方便找到该条记录的历史版本。
四、undo log的工作原理
在更新数据之前,MySQL会提前生成undo log日志,当事务提交的时候,并不会立即删除undo log,因为后面可能需要进行回滚操作,要执行回滚(rollback)操作时,从缓存中读取数据。undo log日志的删除是通过通过后台purge线程进行回收处理的。
同样,通过一张图来理解undo log的工作原理。
如上图:
- 1、事务A执行update操作,此时事务还没提交,会将数据进行备份到对应的undo buffer,然后由undo buffer持久化到磁盘中的undo log文件中,此时undo log保存了未提交之前的操作日志,接着将操作的数据,也就是Teacher表的数据持久保存到InnoDB的数据文件IBD。
- 2、此时事务B进行查询操作,直接从undo buffer缓存中进行读取,这时事务A还没提交事务,如果要回滚(rollback)事务,是不读磁盘的,先直接从undo buffer缓存读取。
用undo log实现原子性和持久化的事务的简化过程:
假设有A、B两个数据,值分别为1,2。
- A. 事务开始
- B. 记录A=1到undo log中
- C. 修改A=3
- D. 记录B=2到undo log中
- E. 修改B=4
- F. 将undo log写到磁盘 -------undo log持久化
- G. 将数据写到磁盘 -------数据持久化
- H. 事务提交 -------提交事务
之所以能同时保证原子性和持久化,是因为以下特点:
- 更新数据前记录undo log。
- 为了保证持久性,必须将数据在事务提交前写到磁盘,只要事务成功提交,数据必然已经持久化到磁盘。
- undo log必须先于数据持久化到磁盘。如果在G,H之间发生系统崩溃,undo log是完整的,可以用来回滚。
- 如果在A - F之间发生系统崩溃,因为数据没有持久化到磁盘,所以磁盘上的数据还是保持在事务开始前的状态。
缺陷:每个事务提交前将数据和undo log写入磁盘,这样会导致大量的磁盘IO,因此性能较差。 如果能够将数据缓存一段时间,就能减少IO提高性能,但是这样就会失去事务的持久性。
undo日志属于逻辑日志,redo是物理日志,所谓逻辑日志是undo log是记录一个操作过程,不会物理删除undo log,sql执行delete或者update操作都会记录一条undo日志。
五、undo log的相关参数
- innodb_undo_directory
指定undo log日志的存储目录,默认值为./。
- innodb_undo_logs
在MySQL5.6版本之后,可以通过此参数自定义多少个rollback segment,默认值为128。
- innodb_undo_tablespaces
指定undo log平均分配到多少个表空间文件中,默认值为0,即全部写入一个文件中。不建议修改为非0值,我们直接使用默认值即可。
在InnoDB存储引擎中,在启动日志中也会提示:不建议修改 innodb_undo_tablespaces为非0的值。
附录:参考资料
https://www.cnblogs.com/f-ck-need-u/p/9010872.html#auto_id_11
https://www.cnblogs.com/wyy123/p/7880077.html
《MySQL技术内幕(第5版)》
MySQL回滚日志(undo log)总结相关推荐
- 分布式事务Seata源码解析十:AT模式回滚日志undo log详细构建过程
文章目录 一.前言 二.准备undo log 0.undo log 样例 1)undo log表结构 2)rollback_info(回滚日志数据) 1.before image的构建 1)业务表元数 ...
- mysql重做日志与binlog日志区别_MySQL中的重做日志(redo log),回滚日志(undo log),以及二进制日志(binlog)的简单总结...
MySQL中有六种日志文件,分别是 重做日志(redo log) 回滚日志(undo log) 二进制日志(binlog) 错误日志(errorlog) 慢查询日志(slow query log) 一 ...
- mysql重做日志_详解MySQL 重做日志(redo log)与回滚日志(undo logo)
前言: 前面文章讲述了 MySQL 系统中常见的几种日志,其实还有事务相关日志 redo log 和 undo log 没有介绍.相对于其他几种日志而言, redo log 和 undo log 是更 ...
- mysql重做日志恢复数据_MySQL中重做日志,回滚日志,以及二进制日志的简单总结...
MySQL中有六种日志文件, 分别是:重做日志(redo log).回滚日志(undo log).二进制日志(binlog).错误日志(errorlog).慢查询日志(slow query log). ...
- mysql 表空间收缩_【135期】谈谈MySQL中的重做日志,回滚日志,以及二进制日志的区别及各自作用...
点击上方"Java面试题精选",关注公众号 面试刷图,查缺补漏 >>号外:往期面试题,10篇为一个单位归置到本公众号菜单栏->面试题,有需要的欢迎翻阅 阶段汇总集 ...
- mysql重做日志与binlog日志区别_【135期】谈谈MySQL中的重做日志,回滚日志,以及二进制日志的区别及各自作用...
MySQL中有六种日志文件,分别是:重做日志(redo log).回滚日志(undo log).二进制日志(binlog).错误日志(errorlog).慢查询日志(slow query log).一 ...
- MySQL日志(undo log 和 redo log 实现事务的原子性/持久性/一致性)
日志的重要性 日志绝对是数据库的核心. 持久化的日志记录了各种重要的信息. 数据的恢复需要依赖日志. 慢查询sql语句需要用到慢查询日志.以及错误日志中保存着mysqld数据库服务端在启动过程中 ...
- mysql数据库回滚日志_超干货!为了让你彻底弄懂 MySQL 事务日志,我通宵搞出了这份图解...
作者 | Amazing10 责编 | 屠敏 本文为业余码农投稿,已获授权 还记得刚上研究生的时候,导师常挂在嘴边的一句话,"科研的基础不过就是数据而已."如今看来,无论是人文社科 ...
- 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 ...
最新文章
- 7-3 逆序的三位数 (Java)
- 【数字信号处理】相关函数应用 ( 正弦信号 的 自相关函数 分析 | 在白噪声中检测正弦信号 )
- 【哲学探讨】娱乐至死
- jvm 性能调优工具之 jstat
- all方法 手写promise_试题-手写实现一个 promise.all - 拿OFFER
- 网站建设中 模板_网站建设之模板网站的缺点
- 中飞院计算机学院的宿舍,广州民航职业技术学院宿舍怎么样 住宿条件好不好...
- python读取txt第二行_使用python获取csv文本的某行或某列数据的实例
- sqli-labs(19)
- 基于SpringBoot的在线问卷调查管理系统
- Mac常见操作:写给媳妇的说明书
- OTL/OCL/BTL/甲类/乙类/甲乙类
- 电商项目:高仿小米商城(一)
- 《 指数基金投资指南 》by 银行螺丝钉 - 笔记 - 1、2章
- 【70后、80后、90后嘚啵嘚】招募特约评论员啦!
- KDD 2020(五) | 基于多源异构信息整合的视频标题生成模型(作者带你读论文)...
- 生命与自然的相互感应
- linux中Iscpi命令详解(四)
- 查看自己手机是否支持Google服务
- k线顶分型 python_顶底分型的实战操作要点(转)
热门文章
- 2018计算机本科论文,计算机科学学院关于2018届本科毕业论文(设计)的工作安排...
- MLOps- 吴恩达Andrew Ng Data Definition and Baseline Week3 论文等资料汇总
- cpp调用python_从python ctypes调用CPP函数
- 利用模板类型实现累加
- Optional Interview with Benny the Irish Polyglot abo---coursera课程Learn how to learn
- 相干检测--概念,原理,科斯塔斯环
- 简单易学!一步步带你理解机器学习算法——马尔可夫链蒙特卡罗(MCMC)
- 找工作知识储备(2)---数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
- 【HDU 5965】扫雷【线性递推】
- 566.重塑矩阵(力扣leetcode) 博主可答疑该问题