MySQL中 redo log、undo log、bin log的理解
文章目录
总结
redo log用来实现事务的持久性,undo log用来实现事务的原子性以及MVCC(隔离性),bin log主要用于数据备份。
redo log(持久性)
重做日志用来实现事务的持久性,它由两部分组成:
- 一是内存中的重做日志缓冲(redo log buffer),它是易失的;
- 二是重做日志文件(redo log file),它是持久的。
InnoDB是事务的存储引擎,其通过Force Log at Commit机制实现事务的持久性,即当事务提交时,必须先将该事务的所有日志写入到重做日志文件进行持久化,待事务的COMMIT操作完成才算完成。
为了确保每次日志都写入重做日志文件,在每次将重做日志缓冲写入重做日志文件后,InnoDB存储引擎都需要调用一次fsync操作。
undo log(原子性、隔离性)
事务有时还需要进行回滚操作,这时就需要undo。因此在对数据库进行修改时,InnoDB存储引擎不但会产生redo,还会产生一定量的undo。这样如果用户执行的事务或语句由于某种原因失败了,又或者用户请求回滚,就可以利用这些undo信息将数据回滚到修改之前的样子。
redo存放在重做日志文件中,与redo不同,undo存放在数据库内部的一个特殊段中,这个段称为undo段。undo段位于共享表空间内。undo是逻辑日志,因此只是将数据库逻辑地恢复到原来的样子。当InnoDB存储引擎回滚时,它实际上做的是与先前相反的工作。对于每个INSERT,InnoDB存储引擎会完成一个DELETE;对于每个DELETE,InnoDB存储引擎会执行一个INSERT;对于每个UPDATE,InnoDB存储引擎会执行一个相反的UPDATE,将修改前的行放回去。
除了回滚操作,undo的另一个作用是MVCC,即在InnoDB存储引擎中MVCC的实现是通过undo来完成。当用户读取一行记录时,若该记录已经被其他事务占用,当前事务可以通过undo读取之前的行版本信息,以此实现非锁定读取。
bin log(数据备份)
二进制日志记录了对MySQL数据库执行更改的所有操作,但是不包括SELECT和SHOW这类操作,因为这类操作对数据本身并没有修改。
总的来说,二进制日志主要有以下几种作用:
- 恢复:某些数据的恢复需要二进制日志。
- 复制:通过复制和执行二进制日志使一台远程的MySQL数据库与一台MySQL数据库进行实时同步。
- 审计:用户可以通过二进制日志中的信息来进行审计,判断是否有对数据库进行注入的攻击。
加分回答
redo log通常是物理日志,记录的是页的物理修改操作。redo log基本上都是顺序写的,在数据库运行时不需要对redo log的文件进行读取操作。
undo log是逻辑日志,根据每行记录进行记录,而undo log是需要进行随机读写的。同时,undo log会产生redo log,也就是undo log的产生会伴随着redo log的产生,这是因为undo log也需要持久性的保护。
bin log是在数据库的上层产生的,并且bin log 不仅仅针对于InnoDB存储引擎,MySQL中任何存储引擎对于数据库的更改都会产生二进制日志。bin log 是一种逻辑日志,其记录的是对应的SQL语句,其记录的是对于每个页的修改,bin log只在事务提交完成后进行一次写入。