一:Bin Log 简介
之前介绍了Buffer Pool、Undo Log(回滚日志)、Redo Log(重做日志)、Redo Log Buffer等一些InnoDB存储引擎的插件。今天就介绍另一个日志文件--Bin Log(归档日志),那么Bin Log 的作用是什么呢?之前介绍的Redo Log是一种偏向物理性质的重做日志,里面记录的格式类似于:对哪个数据页中的什么记录,做了什么修改。而Bin Log叫做:归档日志,他里面的日志内容偏向于逻辑性--类似于”对user 表中的id = 1 的一行数据做了更新操作,更新以后的值是什么“。并且Bin Log不是InnoDB存储引擎特有的日志文件,是属于mysql server自己的日志文件。
Bin Log的刷盘策略:设置参数:sync_binlog
0:每秒一次,将os cache中的数据刷到磁盘Bin Log 文件中
1:每次提交事务时,将数据刷到磁盘Bin Log 文件中
n:每提交n个事物将Bin Log 写入磁盘
二:Bin Log的使用
在我们提交事物的时候,会把Redo Log 日志写入磁盘文件中去。然后其实在提交事务的时候,我们同时还会把这次更新对应的Bin Log 日志写入到磁盘文件中去,当我们把Bin Log 写入磁盘文件之后,会将对应的Bin log文件名称和这次更新的Bin log日志文件位置,都写入到Redo log 文件日志里去,同时Redo log日志文件里会写一个commit 标记,这样才算最终完成了事物的提交。
那么这个在Redo log日志文件写入commit 有什么意义呢?这其实是用来保持Redo Log 日志与Bin log日志一致的。例如:我们在执行第5步的时候,mysql宕机了,此时就会因为没有最终事务commit标记在Redo Log日志中,所以此次事务判定为不成功,不会出现Redo Log日志文件里有这次更新的日志,但是Bin Log 日志文件里没有这次更新的日志,不会出现数据不一致的情况。同样要是第6步就宕机了,也会因为没有将commit写入到Redo Log 中,而判定此次事务无效。只有将commit标记写入到Redo Log 中才会判定此次事务是成功的。
最后,后台IO线程会将内存中Buffer Pool中修改后的脏数据刷回到磁盘中。 如果在你IO线程把脏数据刷回到磁盘之前,mysql宕机了也没关系。因为重启之后,会根据Redo Log日志(重做日志)恢复之前提交事物去修改内存中的数据,之后IO线程还是会将修改后的数据刷到磁盘中。
借道友法力一用:
========================== stay hungry stay foolish =============================