一、什么是redolog
redolog是基于InnoDB存储引擎下的日志文件,也叫重做日志。用于记录数据页的物理变化,记录数据修改后的值。无论事务是否成功提交都会产生记录。当mysql产生故障,可以采用redolog日志恢复数据,同时redolog日志是顺序写入磁盘,也就是顺序IO,刷盘速率快。MYSQL事务的持久性就体现在这一方面。
redolog包括两部分,一是redolog buff(内存中的日志缓冲区),一是redolog file(日志文件)。MYSQL执行一次DML语句,会先将记录写入redlog buff中,后在某一个时间点再一次性将这些记录写入redolog file。也就是WAL(Write-Ahead Logging)技术(先写日志后刷盘)
二、为什么需要redolog
简单来讲,redolog保证了事务的持久性。InnoDB引擎下,数据的读写操作都是在从磁盘文件(idb文件)中一次性拷贝一页的数据到buff pool中。事务提交后buff pool不会立即刷盘(因为InnoDB是以页为单位与磁盘进行交互的,一个事务可能只修改了一页上的几个字节,此时如果将整页数据进行刷盘太浪费资源。二是因为一个事务涉及到的数据可能存放在多个数据页上,彼此并不连续。也就是会产生随机IO,随机IO需要进行磁盘的磁头寻道等操作会消耗更多随机成本)
所以需要引入redolog,任意事务对任意页进行的修改都会记录在redolog里,在事务提交后,我们只需要保证redolog成功落盘即可,同时redolog是追加写操作,也就是顺序IO,落盘时时间成本低。即使mysql宕机了,我们也可以通过redolog恢复数据。
三、undolog
undolog用来实现事务四大特性中有一个是原子性,原子性是指对数据库的一系列操作,要么全部成功,要么全部失败,不可能出现部分成功的情况。
undo log主要记录数据的逻辑变化,比如一条INSERT语句对应一掉DELETE的undo log,一个UPDATE语句对应一条相反的undo log,这样在发生错误的时候,可以使事务回滚到之前的数据状态。