重做日志,记录的是事务提交时数据页的物理修改,是用来实现事务的持久性。
该日志文件由两部分组成:重做日志缓冲(redo log buffer)以及重做日志文件(redo log file),前者是在内存中,后者在磁盘中。
简单说:保证脏页刷新回磁盘出现问题时,进行数据恢复,保证持久性。
整个过程:InnoDB的内存有缓冲池,增删改时修改缓冲池的数据,没有的话,先从磁盘加载存到缓冲区再修改。修改后的数据页叫做脏页,脏页会在一定时间刷新到磁盘,保证数据一致。如果这时出错,数据没有持久化,所以需要redolog。当进行增删改后,回先记录到redo log buffer中记录数据页变化,事务提交的时候会把bufffer中的变化刷新到磁盘中持久保存,这时如果出错可以通过redolog进行数据恢复。
而如果脏页成功刷新到磁盘 或者涉及到的数据已经落盘,此时redolog就没有作用了,就可以删除了,所以存在的两个redolog文件是循环写的。
那为什么每一次提交事务,要刷新redo log 到磁盘中呢,而不是直接将buffer pool中的脏页刷新到磁盘呢 ?
因为在业务操作中,我们操作数据一般都是随机读写磁盘的,而不是顺序读写磁盘。 而redo log在往磁盘文件中写入数据,由于是日志文件,所以都是顺序写的。顺序写的效率,要远大于随机写。 这种先写日志的方式,称之为 WAL(Write-Ahead Logging)。