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

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

内容简介: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的练级攻略


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

查看所有标签

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

Blog Design Solutions

Blog Design Solutions

Richard Rutter、Andy Budd、Simon Collison、Chris J Davis、Michael Heilemann、Phil Sherry、David Powers、John Oxton / friendsofED / 2006-2-16 / USD 39.99

Blogging has moved rapidly from being a craze to become a core feature of the Internetfrom individuals sharing their thoughts with the world via online diaries, through fans talking about their favori......一起来看看 《Blog Design Solutions》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具