当前位置: 首页 > news >正文

【面试题】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保证了事务的原子性和一致性

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【功能】DOTween动画插件使用
  • 【js自学打卡8】filter / 类与原型链 / 转字符串
  • 关于Mysql的面试题(实时更新中~)
  • Python 基础——元组
  • Unity UGUI 之 Graphic Raycaster
  • 珈和科技完成全国首个农险服务类数据产品入表,实现数据资产化
  • ModbusRTU转Profinet协议转化网关(建议收藏吖)
  • lua 游戏架构 之 SceneLoad场景加载(一)
  • 【Nacos】Nacos服务注册与发现 心跳检测机制源码解析
  • Unity UGUI 之EventSystem
  • PyTorch Autograd内部实现
  • RICHTEK立锜科技 WIFI 7电源参考设计
  • OCC 创建点线面体
  • js 只读对象
  • CSRF+XSS组合攻击实战
  • 0x05 Python数据分析,Anaconda八斩刀
  • canvas绘制圆角头像
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • ComponentOne 2017 V2版本正式发布
  • Github访问慢解决办法
  • hadoop集群管理系统搭建规划说明
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • Linux中的硬链接与软链接
  • MySQL数据库运维之数据恢复
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • React系列之 Redux 架构模式
  • TCP拥塞控制
  • 坑!为什么View.startAnimation不起作用?
  • 如何设计一个比特币钱包服务
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 使用Swoole加速Laravel(正式环境中)
  • 算法---两个栈实现一个队列
  • 我感觉这是史上最牛的防sql注入方法类
  • 由插件封装引出的一丢丢思考
  • ​决定德拉瓦州地区版图的关键历史事件
  • (33)STM32——485实验笔记
  • (javaweb)Http协议
  • (k8s)Kubernetes本地存储接入
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (第27天)Oracle 数据泵转换分区表
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (每日一问)基础知识:堆与栈的区别
  • (七)glDrawArry绘制
  • (四)stm32之通信协议
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • ****Linux下Mysql的安装和配置
  • **CI中自动类加载的用法总结
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .NET Core中Emit的使用
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded