- MySQL的redo日志和undo日志主要时为了保障mysql事务的原子性的操作
事务
-事务特性是针对于MySQL当前的主流存储引擎的InnoDB支持事务的特性。
事务的ACID特性
- 原子性(Atomic):所有语句作为一个单元全部成功或者全部失败
- 一致性(Consistent):如果事务开始是处于一致状态,则在执行该事务期间将保留一致状态
- 在事务内看到的数据状态是一样的
- 隔离性(isolated):事务之间不会相互影响
- 持久性(Durable):事务完成之后,所作的所有更改都会准确的记录在数据库中,所作的更改不会丢失,会被持久化保存
redo日志
- 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日志来进行是否进行回滚操作的,和用来恢复数据的
- 之前的事务已经commit,周期性的保存入redo_log,当意外宕机之后重新启动,会根据.ibd文件中的数据重新载入内存,并且根据redo_log重新修改数据,这叫做数据的前滚
- 没有commit,会结合undo_log来判断是否需要将数据进行回滚
- 已经commit,并且数据已经写入磁盘中,会自动清空redo_log中的数据