【面试题】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保证了事务的原子性和一致性
相关推荐
清冬暖雪1 小时前
jmeter连接mysql数据库以及常规用法
数据库·jmeter·mysql
DBdoctor官方3 小时前
MySQL内部临时表(Using temporary)案例详解及优化解决方法
java·开发语言·数据库·sql·mysql·临时表·内部临时表
杨侨治5 小时前
Spring&AOP&Spring事物管理
java·开发语言·数据库·笔记·spring·mybatis·java基础
Java小白白同学6 小时前
MongoDB 查询分享 包含( 筛选 分组 排序 脱敏 格式化日期)
数据库·mongodb
zhaozhiqiang19817 小时前
服了!DELETE 同一行记录也会造成死锁---图文解析
数据库
jingyu飞鸟7 小时前
Centos系统二进制安装mysql5.7.44、添加环境变量、复制启动脚本、初始化数据库、设置用户密码
linux·运维·服务器·数据库·mysql
这孩子叫逆8 小时前
19. ArrayList的扩容机制是怎样的?如何优化ArrayList的性能?
java·前端·数据库
Rverdoser9 小时前
MongoDB适用场景
数据库·mongodb
2401_858425559 小时前
SQL视图:简化复杂查询的利器
数据库·sql·oracle