默认情况下,InnoDB存储引擎的数据存放目录下有两个名为ib_logfile0
和ib_logfile1
文件,这两个文件就是重做日志文件(redo log file
),该文件记录了对于InnoDB存储引擎的事务日志。
重做日志的作用是当数据库发生宕机导致发生media failure
时,可以通过这个文件进行数据恢复,用来保证InnoDB表存储的数据不会轻易因为宕机而丢失。具体来说,就是用来恢复已经提交的事务中因为宕机的缘故还没有来得及持久化到磁盘的事务操作。
重做日志缓冲(redo log_buffer)
重做日志缓冲用来缓冲重做日志,默认大小为8MB,可通过配置项innodb_log_buffer_size
设置大小,一般来说不需要设置地很大。
重做日志缓冲会在以下时机将缓冲内容持久化到重做日志文件:
- 每1秒钟自动刷新,由
Master Thread
执行 - 事务提交时
- 重做日志缓冲小于50%
可以看出重做日志缓冲刷新得很频繁,所以也就不需要设置很大的空间了。重做日志缓冲刷新到物理磁盘时,是按1个扇区(512字节)的大小进行写入的,可以保证写入必然是成功的,无需进行doublewrite
操作。
重做日志文件组
每个InnoDB存储引擎有至少一个重做日志文件组,每个文件组下至少有两个重做日志文件,大小一致,运行过程中以循环写入方式运行。
用户也可以设置多个镜像日志组,达到将不同的文件组分别存入到不同的物理磁盘上,达到高可用性。
默认情况下,InnoDB具有1个重做日志组,每个重做日志组有2个重做日志文件。
配置参数
参数名 | 作用 |
---|---|
innodb_log_file_size | 可以指定每个重做日志文件的大小,最大值可设置为512GB |
innodb_log_files_in_group | 每个日志文件组中重做日志文件的数量,默认为2 |
innodb_mirrored_log_groups | 日志组的数量,默认为1 |
innodb_log_group_home_dir | 日志文件组所在路径 |
重做日志文件大小设置过大或过小会产生的问题
重做日志的大小设置对InnoDB性能有着很大的影响。如果重做日志文件设置得很大,在宕机后进行恢复的时间会很长。如果设置地太小,会导致一个事务的日志可能需要多次切换重做日志文件,同时也会导致频繁发生async checkpoint
从而引发性能抖动。
与二进制日志的区别
1、二进制日志是构建于MySQL整体上的,不仅仅是InnoDB,它可以记录MyISAM等其它存储引擎的日志。而InnoDB的重做日志只记录InnoDB表的页操作。
2、在内容上:二进制日志本质上记录的还是逻辑的SQL设置,类似于每行修改了哪些数据。而重做日志记录的是数据页的物理修改操作,可以通过它来恢复到最后一个事务提交的点。
3、在写入时机上:二进制日志只在事务提交前写入事务内容,对于不支持事务的存储引擎,会在每次执行修改的SQL语句时写入修改内容。对于重做日志,会在事务进行过程中不停地写入到redo log_buffer
,然后持久化到重做日志文件。
重做日志格式
重做日志由多个日志条目(redo entry
)组成,日志条目由4个部分组成:
redo_log_type
:占用1个字节,表示重做日志类型space
:表空间ID,采用压缩方式,占用空间一般小于4个字节page_no
:数据页的偏移量,采用压缩方式redo_log_body
:数据部分