Undo Log 、Binary Log、Redo Log之间到底有什么区别?

news2024/11/15 11:09:19

Undo Log 、Binary Log、Redo Log各自的作用

先抛结论:他们各自的作用是什么

  • Undo Log :用于保证数据库事务原子性
  • Binary Log:用于数据库的数据备份/主从复制
  • Redo Log:用于保证数据库事务持久性

接下来详细谈谈它们

Undo Log

当数据库开启事务之后,如果事务进行到一半时发生错误需要进行回滚,这个时候就需要使用到Undo Log用于数据库事务的回滚,将数据恢复到事务开始之前

如何实现

对于Undo Log的具体操作就是记录相关操作的反操作:

  • 当插入一条记录的时候,记下这条数据的主键,在发生回滚时进行删除
  • 当删除一条记录的时候,记下这条数据的主键,在发生回滚时进行插入
  • 当更新一条数据的时候,记下这条数据的旧值,在发生回滚时将数据更新回旧值

Undo Log中的事务ID以及版本链指针

Undo Log中有一个事务id以及版本链指针

  • 事务ID是用于记录是被哪个事务使用的
  • 版本链指针是用于 Undo Log 指向下一个 Undo Log的,一条又一条的Undo Log通过指针串起了起来从而形成版本链

我们知道MVCC是用于实现事务的隔离性的,MVCC则是通过Undo Log和Read View实现的

Read View是在开启事务时就生成的一张“快照”,整个事务都是使用这个快照,也就是事务开启前的数据库中的数据内容

通过比对当前事务的Read View中的一些字段和不同事务之间的事务id,查看是否满足可见性,如果不满足可见行,就会顺着 undo log 版本链里找到满足其可见性的记录

具体规则如下:

  • Read View中记录了已经提交的事务id且记为min_id,还没有开启的事务的id且记为max_id,创建当前事务的事务id切记为create_id

    那么处于min_id和max_id之间的事务id代表这是还没有提交的事务

  • 当一个事务执行写操作(如插入、更新、删除)时,数据库会将这个事务的 trx_id 记录在相应的数据行中。这样,数据库系统就能够追踪每个数据行是由哪个事务创建或修改的。

  • 如果当前事务去访问记录时,这条记录中的id小于min_id则说明这个版本的记录是在Read View之前提交的,可见

  • 如果当前事务去访问记录时,这条记录中的id大于max_id则说明这个版本的记录是在Read View之后开启的,不可见,通过版本链查找可见的记录

  • 如果当前事务去访问记录时,这条记录中的id处于min_id和max_id之间那么需要再做判断

    • 有一个活跃事务列表,里面记录了已经开启但是没有提交的事务的事务id
    • 如果这个id在活跃事务列表内说明还没有提交,不可见,通过版本链查找可见的记录
    • 如果这个id不在活跃事务列表内说明该事务已经提交,数据对Read View可见

总结

Undo Log是用于数据库事务的回滚的,同时也是实现MVCC的

也就是说Undo Log既保证了事务的原子性也保证了数据库的隔离性

Binary Log

Binary Log里面记录了逻辑变更,也就是记录了所有的表结构变更(对表的插入、更改、删除),以及数据库表的数据变更

当事务提交以后,MySQL会将该事务产生的Binary Log统一写入Binary Log文件中

记录了什么

虽然说Binary Log中记录了逻辑变更,这个逻辑变更到底是什么?

具体来说,Binary Log其实记录了数据库执行的所有操作(除了查询),也就是插入语句,删除语句,更新语句

通过文本文件的形式保存下来,同时以追加写的方式不停的记录

作用

由于以追加写的方式记录了所有的逻辑变更,所以Binary Log更适合用于数据库的数据备份以及主从复制

当我们不小心把数据库里面的所有数据全部删除时,这个时候就得请出我们的Binary Log了,通过执行Binary Log里面的SQL语句就能够将数据库的数据进行恢复

我们部署集群的时候,我们的主库写入Binary Log,然后将Binary Log复制到从库上,再回放Binary Log,这个时候从库里面的数据就能够跟主库的数据保持一致了

数据备份和主从复制的原理都是相同的,都是回放Binary Log

总结

Binary Log 包含了数据库中执行过的写操作的SQL,所以更适合用于备份以及主从复制

Redo Log

当数据库开启事务之后,会将所有的数据修改记录到Redo Log中,所以说当数据库发生崩溃后使用Redo Log将数据库恢复到最近一次的事务提交之后的状态

具体操作

Redo Log中记录了事务的物理变更,换句话说就是记录了数据库中哪一个地方进行了什么修改

由于MySQL中WAL机制(WAL机制它确保在对数据库进行写入操作之前,相关的日志记录已经被写入到持久化的存储介质上)的存在,MySQL在完成数据修改以后,并不会立刻将数据写入到磁盘中,而是先写入Redo Log中,然后数据在合适的时机写入到磁盘中

为什么要先写入进Redo Log中而不是直接写入磁盘里面?

原因在于Redo Log让磁盘变成了顺序写而不是随机写,提高了写操作的效率

随机写是指一个又一个的数据先在磁盘中找到相应的位置然后再进行写入,顺序写是指第一个数据先找好位置然后把数据一个接一个地依次存入硬盘

写入Redo Log的方式是追加操作,使得写入磁盘操作是顺序写,提高了写入效率

缓存在 redo log buffer 里的 redo log 还是在内存中,它什么时候写入到磁盘中的Redo Log File中?

前置知识:Redo Log有自己的缓存区,每次写好一条Redo Log就放进Redo Log Buffer(也就是缓存区)中然后再将Redo Log Buffer

具体来说有几个时机

  • MySQL关闭的时候
  • 当 redo log buffer 中记录的Redo Log量大于 redo log buffer 内存空间的一半时
  • 后台线程每隔1秒
  • 每次事务提交都会将redo log buffer 中记录的Redo Log写入磁盘
    • 这个操作可以使用三个参数进行控制
    • 当参数为0时,每次事务提交后redo Log还是保留在 redo log buffer 中
    • 当参数为1时,每次事务提交后将redo log buffer 中记录的redo Log写入磁盘
    • 当参数为2时,每次事务提交后将redo log buffer 中记录的redo Log写入操作系统中的文件缓存中
Redo Log写满了会怎么样?

Redo Log是采用循环写的方式进行记录的,可以想象成一个环形,有两个参数,一个记录着当前写的位置,一个记录着末尾位置
在这里插入图片描述

当前位置追上了末尾位置,此时说明文件写满了,这个时候MySQL阻塞停下来,将Buffer Pool中的脏页数据写入到磁盘,再标记Redo Log中哪些数据是可以删除的,接着将这些数据进行删除,此时就有了一大块空出来的空间了,更新一下末尾位置,然后继续开始写,直到下一次当前写的位置又追上末尾位置
在这里插入图片描述

总结

通过Redo Log可以保证在数据库突然发生崩溃的时,将数据恢复到最近一次事务提交的状态,从而保证事务的持久性

由于Redo会不断地擦除一些已经写入到磁盘的数据,所以也就解释了为什么所有数据全部删除时,这个时候就得请出我们的Binary Log而不是我们的Redo Log了

因为Binary Log记录了所有的SQL,而Redo Log并没有记录所有的数据(旧的日志会被新的日志覆盖,因此不会一直增长)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1339604.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于Java并发、JVM面试题

前言 之前为了准备面试,收集整理了一些面试题。 本篇文章更新时间2023年12月27日。 最新的内容可以看我的原文:https://www.yuque.com/wfzx/ninzck/cbf0cxkrr6s1kniv 并发 进程与线程的区别 线程属于进程,进程可以拥有多个线程。进程独享…

【项目】玩具租赁博客测试报告

目录 一、项目背景 二、项目功能 三、功能测试 一、项目背景 玩具租赁系统采用前后端分离的方法来实现,同时使用了数据库来存储相关的数据,同时将其部署到云服务器上。前端主要有十五个页面构成:用户注册、管理员注册、登录页、用户和管理…

java浅拷贝BeanUtils.copyProperties引发的RPC异常 | 京东物流技术团队

背景 近期参与了一个攻坚项目,前期因为其他流程原因,测试时间已经耽搁了好几天了,本以为已经解决了卡点,后续流程应该顺顺利利的,没想到 人在地铁上,bug从咚咚来~ 没有任何修改的服务接口,抛出…

IT安全:实时网络安全监控

了解庞大而复杂的网络环境并非易事,它需要持续观察、深入分析,并对任何违规行为做出快速反应。这就是为什么实时网络安全监控工具是任何组织 IT 安全战略的一个重要方面。 网络攻击和合规性法规是 IT 安全的两个主要驱动因素。同时,数据泄露…

Spring Cloud Gateway 常见过滤器的基本使用

目录 1. 过滤器的作用 2. Spring Cloud Gateway 过滤器的类型 2.1 内置过滤器 2.1.1 AddResponseHeader 2.1.2 AddRequestHeader 2.1.3 PrefixPath 2.1.4 RequestRateLimiter 2.1.5 Retry 2.2 自定义过滤器 1. 过滤器的作用 过滤器通常用于拦截、处理或修改数据流和事…

Springboot+vue的医疗报销系统(有报告),Javaee项目,springboot vue前后端分离项目

演示视频: Springbootvue的医疗报销系统(有报告),Javaee项目,springboot vue前后端分离项目 项目介绍: 本文设计了一个基于Springbootvue的前后端分离的医疗报销系统,采用M(model&a…

百度沧海文件存储CFS推出新一代Namespace架构

随着移动互联网、物联网、AI 计算等技术和市场的迅速发展,数据规模指数级膨胀,对于分布式文件系统作为大规模数据场景的存储底座提出了更高的要求。已有分布式文件系统解决方案存在着短板,只能适应有限的场景: >> 新型分布式…

【产品经理】axure中继器的使用——表格增删改查分页实现

笔记为个人总结笔记,若有错误欢迎指出哟~ axure中继器的使用——表格增删改查分页实现 中继器介绍总体视图视频预览功能1.表头设计2.中继器3.添加功能实现4.删除功能实现5.修改功能实现6.查询功能实现7.批量删除 中继器介绍 在 Axure RP9 中,中继器&…

IntelliJ IDEA Apache Dubbo,IDEA 官方插件正式发布!

作者:刘军 最受欢迎的 Java 集成开发环境 IntelliJ IDEA 与开源微服务框架 Apache Dubbo 社区强强合作,给广大微服务开发者带来了福音。与 IntelliJ IDEA 2023.2 版本一起,Jetbrains 官方发布了一款全新插件 - Apache Dubbo in Spring Frame…

matlab列优先与高维矩阵重构

由于matlab在列化a(:)以及reshape(a)等操作中是列优先的,所以要重构出新的高维度矩阵,通常要把reshape和permute结合起来使用。 先到 http://caffe.berkeleyvision.org/ 下载 训练好的model bvlc_reference_caffenet.caffemodel; 更多caffe使用也请参看…

C#编程艺术:Fizzler库助您高效爬取www.twitter.com音频

数据是当今数字时代的核心资源,但是从互联网上抓取数据并不容易。本文将教您如何利用C#编程艺术和Fizzler库高效爬取Twitter上的音频数据,让您轻松获取所需信息。 Twitter简介 Twitter是全球最大的社交媒体平台之一,包含丰富的音频资源。用…

机器学习系列--R语言随机森林进行生存分析(1)

随机森林(Breiman 2001a)(RF)是一种非参数统计方法,需要没有关于响应的协变关系的分布假设。RF是一种强大的、非线性的技术,通过拟合一组树来稳定预测精度模型估计。随机生存森林(RSF&#xff0…

【Pytorch】学习记录分享8——PyTorch自然语言处理基础-词向量模型Word2Vec

【Pytorch】学习记录分享7——PyTorch自然语言处理基础-词向量模型Word2Vec 1. 词向量模型Word2Vec)1. 如何度量这个单词的?2.词向量是什么样子?3.词向量对应的热力图:4.词向量模型的输入与输出![在这里插入图片描述](https://img-blog.csdni…

solidity案例详解(七)复杂众筹合约

自己原创智能合约,有作业需求可加下面的图片中的裙 1、在 Remix 中,以 Account1 完成“众筹项目”合约的编译和部署。(显示合约、函数、状态变量、结构体、事件的命名) 2、在 Remix 中,以 Account2 完成“参与众筹”合…

【架构】企业信息安全体系架构详解

企业信息安全体系架构来说,是包含技术、运维、管理3个层面。本文说的安全架构,主要集中讨论偏研发技术层面的安全架构。 安全性是软件研发技术体系,系统架构设计阶段的一个关键DFX能力,与可靠性、可服务性、性能等架构属性并列。由于安全性设计自身的特点,涉及到系统架构…

【ARMv8M Cortex-M33 系列 2.1 -- Cortex-M33 使用 .hex 文件介绍】

文章目录 HEX 文件介绍英特尔十六进制文件格式记录类型hex 示例Cortex-M 系列hex 文件的使用 HEX 文件介绍 .hex 文件通常用于微控制器编程,包括 ARM Cortex-M 系列微控制器。这种文件格式是一种文本记录,用于在编程时传递二进制信息。.hex 文件格式最常…

Python+OpenCV 零基础学习笔记(1):anaconda+vscode+jupyter环境配置

文章目录 前言相关链接环境配置:AnacondaPython配置OpenCVOpencv-contrib:Opencv扩展 Notebook:python代码笔记vscode配置配置AnacondaJupyter文件导出 前言 作为一个C# 上位机,我认为上位机的终点就是机器视觉运动控制。最近学了会Halcon发现机器视觉还…

『Linux升级路』冯诺依曼体系结构与操作系统

🔥博客主页:小王又困了 📚系列专栏:Linux 🌟人之为学,不日近则日退 ❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、冯诺依曼体系结构 📒1.1为什么要有体系结构 📒1.2…

23款奔驰GLC260L升级原厂540全景影像 高清环绕的视野

嗨 今天给大家介绍一台奔驰GLC260L升级原厂360全景影像 新款GLC升级原厂360全景影像 也只需要安装前面 左右三个摄像头 后面的那个还是正常用的,不过不一样的是 升级完成之后会有多了个功能 那就是新款透明底盘,星骏汇小许 Xjh15863 左右两边只需要更换…

Next Station of Flink CDC

摘要:本文整理自阿里云智能 Flink SQL、Flink CDC 负责人伍翀(花名:云邪),在 Flink Forward Asia 2023 主会场的分享。Flink CDC 是一款基于 Flink 打造一系列数据库的连接器。本次分享主要介绍 Flink CDC 开源社区在过…