MySQL的binlog

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还是会把这个修改后的数据刷到磁盘文件。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值