1、biglog是什么
redo log属于InnoDB存储引擎特有的log,而binlog叫做归档日志,里面记录的是偏向于逻辑性的日志,类似“对users表中的id=10的一行数据做了更新操作,更新以后的值是什么”
binlog不是InnoDB储存引擎特有的日志文件,是属于mysq server自己的日志文件
2、提交事务写入binlog
提交事务的时候会将redo log日志写入磁盘文件中,同时还会将这次更新对应的binlog日志写入到磁盘文件中。如图所示:
从磁盘加载数据—> 旧值写入undo—> 新值更新Buffer Pool—> 写入redo —> 提交事务redo刷入磁盘—> bin 写入磁盘
3、binlog的刷盘策略分析
binlog的刷盘策略由sync_binlog参数进行控制
当sync_binlog为0时,提交事务写入os cache没有将binlog刷入磁盘,此时系统奔溃,数据丢失
当sync_binlog为1时,提交事务强制将binlog从内存刷入磁盘,系统奔溃数据不会丢失
4、基于binlog和redo log完成事务的提交
binlog写入磁盘文件后,会将本次更新对应的binlog文件名称和这次更新的binlog日志在文件里的位置吸入redo log日志文件中,同时在redo log日志文件写入一个commit标记
5、redo日志写入commit标记
redo日志写入commit标记是用来保持redo log与binlog日志一致的
假设我们在提交事务的时候,执行到步骤5、6、7的时候,mysql宕机,导致redo log、bin log数据不一致,所以必须是redo log中写入最终的事务commit标记,此时事务提交成功,redolog 和 bin log完全是一致的
6、后台IO线程随机将内存更新后的脏数据刷回磁盘
redo log 与bin log 刷入磁盘之后,Buffer Pool中的数据还是脏数据,MySQL有一个后台线程,会在某个时间,随机将内存的buffer pool中修改的脏数据给刷回到磁盘上的数据文件里,如下图所示
IO将Buffer Pool刷回磁盘之后,磁盘与内存里的数据一致;如果IO把Buffer Pool刷回磁盘之前,MySQL宕机奔溃,重启后redo日志会恢复之前提交事务的修改到内存中,IO还是会把这个修改后的数据刷到磁盘文件。