(1)回顾:
redo log在写的时候,都是一个事务里的一组redo log,先暂存一个地方,执行完后把一组redo log写入 redo log buffer ,写入redo log buffer 的时候,是写入里面提前划分好的一个个的redo log block的,选择有空闲的 redo log block写入,redo log block写满后,会在某个时机刷入磁盘里去。
(2)redo log buffer 里的redo log block什么时候可以刷入磁盘文件里去呢?
写入时机四种情况:
(1) 如果写入redo log buffer 的日志已经占据redo log buffer总容量的一半,也就是超过了8MB的redo log在缓存里,此时就会把他们刷入磁盘文件里去。
(2) 一个事务提交的时候,必须把那一组redo log所在的redo log block都刷入磁盘文件里去,只有这样当事务提交后,修改的数据绝对不会丢失,
因为redo log里有重做日志,随时可以恢复事务做的修改
(3) 后台线程定时刷新,有一个后台线程每个1秒就会把redo log buffer 里的 redo log block 刷到磁盘文件里去
(4) MySQL关闭的时候,redo log block都会刷入到磁盘里去
事务提交的时候,超过buffer缓冲区一半时,定时任务1秒刷新
redo log哪怕事务提交的时候写入磁盘文件,也是先进入 os cache 的,进入os 的文件缓存区,所以事务提交的时候强行把redo log刷入物理磁盘文件中需要设置对应的参数,之前说过
基于上述四种情况,不说最后一条:<br />第一条如果瞬间执行大量的高并发的SQL语句,1秒内产生超过8MB的redo log,此时占据redo log buffer 的一半空间,必然直接把redo log刷入磁盘里去,这种场景在MySQL承载高并发请求时候比较常见,比如每秒执行上万个增删改SQL语句,每个SQL产生的redo log 假设几百字节,此时确实是会瞬间产生超过8MB的redo log日志。<br /> 第二条,执行一个事务,这个事务一般都是在几十毫秒到几百毫秒执行完毕的,一般正常情况下,MySQL单事务性能不会超过1秒,否则数据库操作就太<br />慢了。如果在几十或者几百毫秒执行完毕了一个事务,此时就会把这个事务的redo log都刷入磁盘,**第一种情况不常见,第二种比较常见**。<br /> 第三条假设没有别的情况触发,后台线程自己会不停的刷新redo log 到磁盘。
(3)MySQL产生大量的redo log写入日志文件,那么把全部的redo log写入一个日志文件?
实际上默认情况下,redo log都会写入一个目录中的文件里,这个目录通过 show variable like ‘datadir’来查看,可以通过innodb_log_group_home_dir参数来设置这个目录。
然后redo log是有多个的,写满了就会写下一个redo log,而且可以限制redo log文件的数量,通过 innodb_log_file_size 可以指定每个redo log文件的大小,默认是48MB,通过innodb_log_files_in_group 指定日志文件的数量,默认是2个。
默认情况下,目录里就两个日志文件,分别为 ib_logfile0和ib_logfile1,每个48MB,最多就这2个日志文件,就是先写第一个,写满后写第二个,第二个写满覆盖第一个再写第一个,mysql最多保留最近的96MB的 redo log,其实很多了,96MB足够容纳上百万条redo log,如果想保留更多的redo log,可以调整上面的两个参数。