mysql日志

mysql事务的隔离性是通过锁来实现的
而原子性,一致性,持久性就是通过日志来实现的。
REDO LOG 称为 重做日志 ,提供再写入操作,恢复提交事务修改的页操作,用来保证事务的持
久性。
UNDO LOG 称为 回滚日志 ,回滚行记录到某个特定版本,用来保证事务的原子性、一致性。

REDO日志

为什么存在redo日志?

当我们事务提交了,但是数据还没来得及写到数据库的时候就断电了,写入失败。

这样就违背了事务的持久性原则,那么怎么解决?

1,在事务提交前就将数据写入磁盘,然后再commit。

这样io次数多了,但是起码保证了数据持久性

2,在事务提交的时候,将修改的数据存到日志中,一旦断电了,也可以恢复,这样就不用一直io。

好处:

redo日志降低了刷盘频率

redo日志占用的空间非常小

特点:

redo日志是顺序写入磁盘的

事务执行过程中,redo log不断记录

组成:

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

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

redo的整体流程

mysql:日志,redo,undo,为什么使用日志?_java


第1步:先将原始数据从磁盘中读入内存中来,修改数据的内存拷贝

第2步:生成一条重做日志并写入redo log buffer,记录的是数据被修改后的值

第3步:当事务commit时,将redo log buffer中的内容刷新到 redo log file,对 redo log file采用追加

写的方式

第4步:定期将内存中修改的数据刷新到磁盘中

Undo日志

undo log是事务原子性的保证。在事务中 更新数据 的 前置操作 其实是要
先写入一个 undo log
情况一:事务执行过程中可能遇到各种错误,比如 服务器本身的错误 , 操作系统错误 ,甚至是突
然 断电 导致的错误。
情况二:程序员可以在事务执行过程中手动输入 ROLLBACK 语句结束当前事务的执行。
以上情况出现,我们需要把数据改回原先的样子,这个过程称之为 回滚 ,这样就可以造成一个假象:这
个事务看起来什么都没做,所以符合 原子性 要求。

undo log是逻辑日志,对事务回滚时,只是将数据库逻辑地恢复到原来的样子。
redo log是物理日志,记录的是数据页的物理变化,undo log不是redo log的逆过程。