面试解析mysql(二)二阶段提交

   **mysql解密(二) 什么是两阶段提交**
                                  熊大

先看几道面试题:

1、假如dba对你说它可以恢复任意半个月的数据他是怎么做到的呢?
2、一个sql的更新语句执行流程是什么?
3、二阶段提交本质是什么?为什么必须这样做?

先了解下Mysql发展史最早mysql自带的引擎是MyISAM但是他不具备事务的能力只有binlog日志。
而InnoDB 是另一个公司以插件形式引入 MySQL 的带有readlog日志。从而实现了crash-safe的能力

而两阶段提交也是针对InnoDb引擎的

通过上一篇得知mysql其实由两部分组成Service层和存储层一个查询sql得执行过程
那么看下这两个日志的各自特点
binlog:

性别:女
英文名:binlog
中文名:逻辑日志
住址:mysql高档小区Service层
年龄:18
特点:喜欢写详细的日记**
风格:他原先对我笑过三次今天又笑了一次一共三加一次。
备注:Service层姐妹较多连接器、分析器、优化器、执行器、影子(缓存)

readlog:

性别:男
英文名:readlog
中文名:物理日志
住址:mysql高档小区存储层
年龄:20
特点:喜欢写日记
风格:从恋爱开始到现在我一共对他笑了四次。

readlog日志的补充:

readlog共有4个文件共4GB大小也就是说每个文件是1GB。它有两个pos 一个是write pos另外一个是check pos当两个端点相遇
表示4个文件已经写满他会停下来写入到数据文件然后擦出一部分继续写这也是mysql有时候会抖动下的原因
但是这也给了他crash-safe的能力可以依靠到恢复数据但是他不是全量的因为他是循环写

对binlog日志的补充:

binlog 是可以追加写入的。==“追加写”==是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志

经过上面介绍我们男主女主颇有印象那我们进入下一个话题
一个更新的sql语句是怎么执行?(二阶段提交的过程)

table如下:

create table X(ID int primary key, c int);

更新sql如下

update X set c=3+2 WHERE ID=3;

那么过程如下面试解析mysql(二)二阶段提交_第1张图片
这就是鼎鼎有名的二阶段提交:

其实说白了是针对readlog的 它分成了两部分提交。

假如不这样做呢?
先提交binlog后提交readlog

在写完binlog服务宕了。而后重启我们发现库里面的数据是3而binlog里面是5这就造成数据不一致了。

先提交readlog后提交binlog

假设在 redo log 写完binlog 还没有写完的时候,MySQL 进程异常重启。edo log写完之后,系统即使崩溃,仍然能够把数据恢复回来,所以恢复后这一行 c 的值是 5。而binlog未写完为3数据前后也不一致。

这也就是二阶段提交的目的所在:

其实就是保持了两个日志是一致的。

你可能感兴趣的:(mysql,二阶段提交,mysql,sql,数据库)