【面试题】Redo log和Undo log

Redo log

介绍Redo log之前我们需要了解一下,mysql数据操作的流程:

 上述就是数据操作的流程图,可以发现sql语句并不是直接操作的磁盘而是通过操作内存,然后进行内存到磁盘的一个同步。这里我们必须要了解一些区域:

  • 缓冲池(buffer pool):主内存中的一个区域,里面可以缓存磁盘经常操作偶的真实数据,在执行增删查改的时候,先操作缓冲池中的数据(如果缓冲池中没有数据,则从磁盘中加载并且缓存),以一定的频率刷新到磁盘当中,从而减少磁盘io,加快处理速度
  • 数据页(page):是InnoDB存储引擎磁盘管理的最单元,每页默认的大小是16kb。页中存储的是表中一行又行数据

当执行sql语句的时候,首先会操作内存中的缓冲池(首先会判断是否有操作的数据,如果没有从磁盘中加载),因为直接操作内存的性能会比操作磁盘的性能更加高,然后将操作缓冲池中的数据同步到磁盘中,这样的目的就是可以减少磁盘的io加快处理的速度,这样就完成了事务的持久化

但是我们需要想到一个问题,如果我们在将脏页(缓冲池的数据)的数据同步到磁盘中的时候,数据库宕机了,这个时候就会发生数据的丢失,就不能满足事务的持久化了,所以我们就需要Redo log日志来解决这样的问题

Redo Log:重做日志,纪律的是事务提交的时候的数据页的物理修改,是用来实现事务的持久性

操作的流程图如下:

redo log日志主要是分为两个部分:重做日志缓冲以及重做日志文件,前者是在内存中的,后者是在磁盘中的。当事务提交之后会把所有修改信息都存储在日志文件中,用于刷新脏页到磁盘发生错误的时候,进行数据的恢复使用

具体流程就是,当发生增删改的时候,首先会修改buffer pool中的数据,而redo log buffer会记录里面的数据页的变化,一旦日志出现了变化,就会同步到磁盘中的重做日志文件,当发现buffer pool同步数据失败的时候,可以通过日志来同步数据

但是就会有一个疑问:这样是否会拖慢操作的速度呢,不用redo log可以么,当数据页发生变化的时候直接进行内存到磁盘的同步不可以么

是可以的,但是会出现性能的问题,当大量的增删改的sql发过来的时候,内存到磁盘的同步是随机的磁盘的io,这样的性能是很低的。而redo log是顺序的磁盘io,日志文件是追加的,这样性能会提升;这种机制就叫做WAL

  • 顺序 I/O(Sequential I/O):是指读写操作的访问地址连续。在顺序 I/O 访问中,存储设备(如 HDD 硬盘)所需的磁道搜索时间显著减少,因为读/写磁头可以以最小的移动访问下一个块。数据备份和日志记录等业务通常是顺序 I/O 业务。
  • 随机 I/O(Random I/O):则是指读写操作时间连续,但访问地址不连续,随机分布在磁盘的地址空间中。产生随机 I/O 的业务有 OLTP 服务、SQL 操作、即时消息服务等

Undo log

Undo log是一个回滚日志,作用主要是包含两个:提交回滚MVCC(多版本并发控制)。undo log和redo log记录物理日志不一样,他记录的是逻辑日志,undo log可以实现事务的一致性原子性

  • 可以认为当delete一条数据的时候,undo log会记录一条对应的insert记录,反之亦然
  • 当update一条记录的时候,它记录一条对应相反的update记录。当执行rollback时,就可以从undo log中的逻辑记录读取到相应的内容并进行回滚

Redo log和undo log区别

  • lredo log: 记录的是数据页的物理变化,服务宕机可用来同步数据
  • lundo log :记录的是逻辑日志,当事务回滚时,通过逆操作恢复原来的数据
  • lredo log保证了事务的持久性,undo log保证了事务的原子性和一致性

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

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

相关文章

华为HCIP Datacom H12-821 卷42

42.填空题 如图所示,MSTP网络中SW1为总根,请将以下交换机与IST域根和主桥配对。 参考答案:主桥1468 既是IST域根又是主桥468 既不是又不是就是25 解析: 主桥1468 既是IST域根又是主桥468 既不是又不是就是25 43.填空题 网络有…

[日进斗金系列]用码上飞解决企微开发维修管理系统的需求

前言: 今天跟大家唠唠如何用小money生 大money的方法,首先我们需要准备一个工具。 这个工具叫码上飞CodeFlying,它是目前国内首发的L4级自动化智能软件开发平台。 它可以在短时间内,与AI进行几轮对话就能开发出一个可以解决实际…

WEB前端06-BOM对象

BOM浏览器对象模型 浏览器对象模型:将浏览器的各个组成部分封装成对象。是用于描述浏览器中对象与对象之间层次关系的模型,提供了独立于页面内容、并能够与浏览器窗口进行交互的对象结构。 组成部分 Window:浏览器窗口对象 Navigator&…

区块链资料

Quantstamp - Public Security Assessments smart-contract-sanctuary-bsc/contracts/mainnet at master tintinweb/smart-contract-sanctuary-bsc GitHub https://github.com/slowmist/Cryptocurrency-Security-Audit-Guide/blob/main/README_CN.md sFuzz: 高效自适应的智…

Spring3(代理模式 Spring1案例补充 Aop 面试题)

目录 一、代理模式 介绍 意图 主要解决的问题 使用场景 实现方式 关键代码 应用实例 优点 缺点 使用建议 注意事项 结构 什么是代理模式? 为什么要用代理模式? 有哪几种代理模式? 1. 静态代理 实现 2. 基于接口的动态代理…

《昇思25天学习打卡营第20天|GAN图像生成》

生成对抗网络(GAN)是一种深度学习模型,用于生成逼真的图像。在手写数字识别的任务中,GAN 可以用来生成与真实手写数字相似的图像,以增强模型的训练数据集。GAN 主要由两个部分组成:生成器(Gener…

Spring Data Jpa 原生SQL联表查询返回自定义DTO

Spring Data Jpa 原生SQL联表查询返回自定义DTO 方案一:返回Map 这个就不说了 方案二:实体定义成接口的形式 该方式最直观!!推荐!!! 注意:XxxDto是interface接口,而…

WPF/C#:在WPF中如何实现依赖注入

前言 本文通过 WPF Gallery 这个项目学习依赖注入的相关概念与如何在WPF中进行依赖注入。 什么是依赖注入 依赖注入(Dependency Injection,简称DI)是一种设计模式,用于实现控制反转(Inversion of Control&#xff0…

[Redis]典型应用——缓存

什么是缓存 缓存(Cache)是一种用于临时存储数据的机制,目的是提高数据访问速度和系统性能。 核心思路就是把一些常用的数据放到触手可及(访问速度更快)的地方,方便随时读取 缓存是一个相对的概念,比如说&#xff0c…

EE trade:强平和爆仓的区别

在金融交易市场中,杠杆交易的引入,让投资者可以用少量的资金撬动更大的头寸,获取更大的收益。然而,杠杆交易也带来了更大的风险,一旦市场波动,投资者可能会面临强平或爆仓的风险。了解强平和爆仓的区别&…

选择Maya进行3D动画制作与渲染的理由

如果你对3D动画充满热情并追求成为专业3D动画师的梦想,你一定听说过Maya——近年来3D动画的行业标准。Maya被3D艺术家广泛使用,你是否想知道为什么Maya总是他们的首选?下面一起来了解下。 一、什么是Maya? 由Autodesk开发的Maya是…

2024年土木建筑与结构工程国际会议(IACCASE 2024)

2024年土木建筑与结构工程国际会议 2024 International Conference on Civil and Structural Engineering 【1】会议简介 2024年土木建筑与结构工程国际会议旨在为全球土木建筑与结构工程领域的专家学者、研究人员及从业人员提供一个交流与合作的平台。会议聚焦该领域的最新研究…

影院选座系统小程序的设计

管理员账户功能包括:系统首页,个人中心,用户管理,影院信息管理,电影类型管理,放映厅管理,电影信息管理,系统管理 微信端账号功能包括:系统首页,影院信息&…

学习小记-Nacos的服务注册与发现原理

服务注册: 当一个服务实例启动时,它会向 Nacos 服务器注册自己的信息,包括 IP 地址、端口号、元数据(如服务版本、区域信息等)。服务实例使用 Nacos API 发送注册请求,Nacos 服务器接收请求并存储服务实例信…

[iOS]浅析isa指针

[iOS]浅析isa指针 文章目录 [iOS]浅析isa指针isa指针isa的结构isa的初始化注意事项 上一篇留的悬念不止分类的实现 还有isa指针到底是什么 它是怎么工作的 class方法又是怎么运作的 class_data_bits_t bits; // class_rw_t * plus custom rr/alloc flags 这里面的class又是何方…

python的tkinter、socket库开发tcp的客户端和服务端

一、tcp通讯流程和开发步骤 1、tcp客户端和服务端通讯流程图 套接字是通讯的利器,连接时要经过三次握手建立连接,断开连接要经过四次挥手断开连接。 2、客户端开发流程 1)创建客户端套接字 2)和服务端器端套接字建立连接 3&#x…

Linux·基本指令(下)

1. mv 指令 (move) 语法:mv[选项] 源文件或目录 目标文件或目录 功能:将源文件或目录剪贴到一个新位置,或给源文件或目录改名但不会改变其内容 常用选项: -f :force 强制,如果目标文件已经存在,…

HCIE-AI大模型直通车火热报名中

第一阶段:HCIA-AI Solution Architect(直播,39课时) 该阶段详细介绍 AI 大模型所需基础技术栈,包含深度学习基础、计算机视觉技术、自然语言处理技术、华为开源深度学习框架 MindSpore、注意力制、Transformer 架构&am…

Spock单元测试框架使用介绍和实践

背景 单元测试是保证我们写的代码是我们想要的结果的最有效的办法。根据下面的数据图统计,单元测试从长期来看也有很大的收益。 单元测试收益: 它是最容易保证代码覆盖率达到100%的测试。可以⼤幅降低上线时的紧张指数。单元测试能更快地发现问题。单元测试的性…

【spring boot】初学者项目快速练手

一小时带你从0到1实现一个SpringBoot项目开发_哔哩哔哩_bilibili 一、简介 二、项目结构 三、代码结构 1.生成框架 Spring Initializr 快速生成一个初始的项目代码,会生成一个demo文件 打开intellj idea,导入demo文件 2.目录结构 源码都放在src-ma…