04 借着更新语句在InnoDB存储引擎中的执行流程,聊聊binlog是什么?
1.mysql的binlog到底是什么东西?
binlog是归档日志,他里面记录的是偏向于逻辑性的日志,比如对use表id=10这行做了更新操作,更新后的值是什么
binlog不是innoDB存储引擎特有的日志文件,是属于mysql server 自己的日志文件
2.提交事务的时候同时写入binlog,在我们提交事务的时候,会把redo log写到磁盘,其实也会把binlog写入磁盘
3.binlog的刷盘策略分析
对于binlog日志,有不同的刷盘策略,有一个sync_binlog参数可以控制binlog的刷盘策略
当值是0时,此时你把binlog写入磁盘的时候,其实不是直接进入磁盘的,而是进入了os cache内存缓存,当这时宕机就会数据丢失
当值是1时,此时把binlog写入磁盘的时候,会直接进入磁盘,哪怕宕机数据也不会丢失
4.当我们把binlog写入磁盘文件后,接着就会完成最终的事务提交,此时会把本次更新对应的binlog文件名称和更新binlog日志在文件中的位置都写入到redo log日志文件里,同时在redo log 日志文件中写入一个commit标记,完成了这个事情才算完成了事务的提交
5.最后一步在redo log 写入commit标记有什么意义?
用来保持redo log 和binlog一致的,比如上图5.6.7都走完才算提交了事务,redo日志刷入磁盘后宕机了,这时没有最终的commit标记在redo log里,这里就不算事务提交成功。
当binlog日志写入磁盘后宕机了,这时commit标记还没有在redolog里这里也不算事务提交成功。
必须是redo log中有最终的commit标记,然后事务提交成功,这样redo log日志和binlog日志才是一致的