MySQL之undo日志与redo日志详解

  • MySQL的redo日志和undo日志主要时为了保障mysql事务的原子性的操作

事务

-事务特性是针对于MySQL当前的主流存储引擎的InnoDB支持事务的特性。

事务的ACID特性

  • 原子性(Atomic):所有语句作为一个单元全部成功或者全部失败
  • 一致性(Consistent):如果事务开始是处于一致状态,则在执行该事务期间将保留一致状态
    • 在事务内看到的数据状态是一样的
  • 隔离性(isolated):事务之间不会相互影响
  • 持久性(Durable):事务完成之后,所作的所有更改都会准确的记录在数据库中,所作的更改不会丢失,会被持久化保存

redo日志

image.png

  • redo日志主要实现的是事务的持久性的作用
  • 在数据库的某一个数据被更改的时候,首先会将修改的操作写入redo buffer,如果直接commit,则直接将redo buffer中的内容填写入redo_log进行持久化保存,如果没有进行commit,则周期性的将redo buffer中的内容保存入redo_log
  • 在用户数据处理完,或者用户对于数据处理的请求较少的时候,读取redo_log将数据持久化的在磁盘中进行更改,或者是在redo_log的大小达到限定的大小的时候,会使用redo_log将数据进行持久化更改

undo日志

  • MySQL的undo日志也是mysql一致性的重要组成部分
  • 相比于redo日志的记录数据的变化,undo日志更像是redo日志的相反,
  • undo日志主要记录的是数据的逻辑变化,为了在发生错误之前回滚之前的操作,需要将之前的操作都记录下来。然后在发生错误之后可以进行回滚

MySQL意外结束之后的开机启动流程

  • 在MySQL数据库服务器开启的时候,会出现多个点,这点就是使用redo日志和undo日志来进行是否进行回滚操作的,和用来恢复数据的

image.png

  1. 之前的事务已经commit,周期性的保存入redo_log,当意外宕机之后重新启动,会根据.ibd文件中的数据重新载入内存,并且根据redo_log重新修改数据,这叫做数据的前滚
  2. 没有commit,会结合undo_log来判断是否需要将数据进行回滚
  3. 已经commit,并且数据已经写入磁盘中,会自动清空redo_log中的数据
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值