面试官:为什么Mysql innoDB是两段式提交?

栏目: 数据库 · 发布时间: 6年前

内容简介:Mysql的日志模块尤为重要,平日的crash-safe和主从都依赖我们的日志模块。Mysql innoDB有两个日志模块:咱们先看一下redolog。

Mysql的日志模块尤为重要,平日的crash-safe和主从都依赖我们的日志模块。

Mysql innoDB日志

Mysql innoDB有两个日志模块: redolog 和 binlog

咱们先看一下redolog。

redolog中文来讲就是重做日志,它有什么用呢?如果每次你的更新或者插入都写入磁盘的话那这个IO成本就比较大了,所以InnoDB就把记录先记录在redolog中,并同时更新到内存中,这样就完成了一次更新或插入了!

而且 redolog是循环写的,也就是有固定大小的 ,当快写满的时候 mysql 就会把把一些记录更新到磁盘中,然后清除更新的那些redolog,给之后的记录腾出空间。

binlog也就是归档日志,它又是什么用呢?顾名思义它的主要作用就是归档(还有主从)!有三种模式:

statement:记录每一条除了查询之外语句。

row:记录每一行记录修改的形式,也就是记录了哪一行改了,改了啥!就比如你update了100条记录,那它就会记录这100条记录改了啥(5.1.5版本才有)

mixed:就是statement和row的混合了,由mysql来判断这条语句用哪种形式记录!(5.1.8版本才有)

binlog没有固定大小,每次都是追加记录不会覆盖之前的。

还有一点,redolog只有InnoDB才有,它是存在引擎层的,而binlog是存在Server层的。所以如果你用的存储引擎的MyISAM,那么你就没有redolog了!

两段式提交

接下来我们再说说两段式提交。

两段式提交,就是我们先把这次更新写入到redolog中,并设redolog为prepare状态,然后再写入binlog,写完binlog之后再提交事务,并设redolog为commit状态。也就是把relolog拆成了prepare和commit两段!

为啥要这样做?

其实redolog是后来才加上的,binlog是之前就有的。一开始存储引擎只有MyISAM,后来才有的InnoDB,然后MyISAM没有事务,没有crash-safe的能力。所以InnoDB搞了个redolog。然后 为了保证两份日志同步,所以才有了两段式提交

你假设一下如果先保存好redolog,然后再记录binlog。如果redolog写好了之后挂了。ok你看起来好像是没问题了,但是你的binlog还没记录,所以这条记录就少了!如果你备份这份binlog之后,你这条记录就永远的少了!

那如果先写binlog再写redolog呢?那binlog写完了,你数据库挂了,那redolog是不是没有,没有的意思就是你以前你没更新成功。但是binlog已经记录好了,在它那边反正是成功了,所以那备份的binlog也不对!

综上所述:两段式提交!

如果有错误欢迎指正!

个人公众号:yes的练级攻略


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

复盘

复盘

陈中 / 机械工业出版社 / 2013-7-23 / 29

复盘是围棋中的一种学习方法,指的是在写完一盘棋之后,要重新摆一遍,看看哪里下得好,哪里下得不好,对下得好和不好的,都要进行分析和推演。 柳传志第一个将复盘引入到做事之中,成为联想三大方法论之一,在联想每一个重大决策的背后,都有复盘的身影。 本书完整系统讲述了复盘的内容,清晰了复盘的价值,给出了复盘的操作步骤,我们可以在自己的工作生活中,应用复盘的方法,向自己学习,随时随地的提高自己,把......一起来看看 《复盘》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

MD5 加密
MD5 加密

MD5 加密工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换