参考徐老师的这篇文章《MySQL架构——MySQL如何使用磁盘空间二》,对Undo和Redo日志的机制和原理,再做一些补充和了解。

Redo日志用于在数据保存为数据文件前存储InnoDB的变更操作,可以优化InnoDB的数据写入及崩溃恢复。InnoDB回放Redo日志文件里的操作以确保事务的一致性,包括在崩溃之前为写入数据文件的数据操作。

用户可以通过"innodb_log_files_in_group"和"innodb_log_file_size"选项配置日子的数量和大小。默认情况下,日志保存在数据路径下,名称为"ib_logfile0"和"ib_logfile1"。如果日志文件不完整(错误的大小或损坏),InnoDB将启动失败,如果日志文件不存在,在服务器启动期间将创建新的文件。日志文件合计最大为512G(innodb_log_file_size*innodb_log_file_in_group),推荐使用2个文件。注意,如果使用过大的Redo日志文件,会增加OS层面的I/O缓冲内存使用率,使用多个小文件客户减少内存的使用率。

MySQL日志 - Undo和Redo日志_数据库

当发生更改的事件时,Redo日志记录事件,之后将其写入数据文件。以上图为例,三个增删改的事件先记录Redo日志,之后innoDB将这些更改写入数据文件。

Undo日志存储事务更改前、未发生变化的数据,innoDB可以利用它访问之前版本的数据。默认情况下,Undo日志保存在Undo表空间,用于MVCC及回滚。当需要回滚事务,或者其他的事务需要查看之前的数据时,innoDB从Undo日志里找回数据。Undo日志分为Insert undo缓冲和Update undo缓冲。

当InnoDB写入Redo日志后,它将这些更改写入数据库的页,在这个操作之前,它将获取一个未经修改的数据库页的副本,并将其保存到Undo日志。

默认情况下,Undo日志使用两个Undo表空间,其保存在数据路径下,用户可以通过更改"innodb_undo_directory"选项更改其位置。Undo日志与普通的数据使用不同的I/O模式,该模式更适用于SSD。

临时表的Undo日志与其他的表不同,由于临时表不使用Redo日志,临时表的Undo日志仅用于服务器运行时的回滚,临时表的Undo日志存储在全局临时表空间的回滚片段(iptmp1),这种特殊类型的Undo日志具有性能优势,因为它能够减少Redo日志记录时带来的I/O开销。

注意:Redo日志和Undo日志与MySQL其他日志不同(通用日志、二进制日志、慢查询日志等等),用户无法使用标准的工具探测里面的内容。