redo log与undo log

redo log 用来保证事务的持久性

InnoDB存储引擎中,大部分情况下redo是物理日志,记录的是数据页的物理变化

redo log 的主要作用是用于数据库的崩溃恢复

redo的组成

一是内存中重做日志缓冲(redo log buffer),是易失的,在内存中

而是重做日志文件(redo log file),是持久的,保存在磁盘中

写入redo的时机:
在数据页修改完成后,在脏页刷出磁盘之前,写入redo日志。注意的是先修改数据,后写日志
redo日志会比数据页先写磁盘

在这里插入图片描述
第一步:先将原始数据从磁盘中读入内存中,修改数据的内存拷贝
第二步:生成一条重做日志并写入redo log buffer,记录的是数据被修改后的值
第三步:当事务commit时,将redo log buffer中的内容刷新到redo log file,对redo log file采用追加写的方式
第四步:定期将内存中修改的数据刷新到磁盘中

InnoDB的事务存储引擎,其通过Force Log at Commit机制实现事务的持久性,即当事务提交时,先将redo log buffer写入到redo log file进行持久化,待事务的commit操作完成后才算完成。这种做法也被称为Write-Ahead Log(预先日志持久化),在持久化一个数据页之前,先将内存中相应的日志持久化。

#####undo

undo主要记录的是数据的逻辑变化,为了在发生错误时回滚之前的操作,需要将之前的操作都记录下来,然后在发生错误时才可以回滚。

undo是一种逻辑日志,有两个作用:

用于事务的回滚
MVCC

在InnoDB存储引擎中,undo log分为:

insert undo log
update undo log
insert undo log是指insert操作中产生的undo log,因为insert操作的记录,只对事务本身可见,对其他事务不可见。故该undo log可以在事务提交后直接删除,不需要进行purge操作。

而update undo log记录的是对delete和update操作产生的undo log,该undo log可能需要提供MVCC机制,因此不能在事务提交时就进行删除。提交时放入undo log链表,等待purge线程进行最后的删除。

undo log是否是redo log的逆过程?

undo log是逻辑日志,对事务回滚时,只是将数据库逻辑地恢复到原来的样子。

而redo log是物理日志,记录的是数据页的物理变化,显然undo log不是redo log的逆过程。

发布了289 篇原创文章 · 获赞 48 · 访问量 10万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览