当前位置:   article > 正文

为什么MySQL存在两个不同日志模块binlog和redolog_有了binlog为什么还要redolog

有了binlog为什么还要redolog

解决数据一致性问题!

以下都是官方解释:【这是因为最开始 MySQL 并没有 InnoDB 引擎(InnoDB 引擎是其他公司以插件形式插入 MySQL 的),MySQL 自带的引擎是 MyISAM,但是我们知道 redo log 是 InnoDB 引擎特有的,其他存储引擎都没有,这就导致会没有 crash-safe 的能力(crash-safe 的能力即使数据库发生异常重启,之前提交的记录都不会丢失),binlog 日志只能用来归档。】

真正的解决该问题的核心是从以下两个方向入手:

1. 对SQL语句在执行的流程有清晰的了解。

2. 对redolog模块和binlog模块有个重新认知,这个认知可以理解为他们在sql语句执行时所担任的角色。


首先,不同的SQL语句的执行流程分为两种:

        查询语句:

权限校验(如果命中缓存)--->查询缓存--->分析器--->优化器--->权限校验--->执行器--->引擎

        增删改语句:

分析器---->权限校验---->执行器--->引擎---redo log(prepare 状态)--->binlog--->redo log(commit状态)

redolog 和 binlog 日志模块只涉及到 增删改语句,只有增删改操作才对数据进行了修改,

查询就只是看看而已,没有实质上的影响,所以需要用到 日志 来 记录 对 数据修改的历史。


redolog可以理解为:数据修改的记录, binlog可以理解为:对数据修改记录的记录

或者 嫌麻烦就干脆理解为,redolog就是写数据,binlog就是记录数据


为什么执行顺序是: redolog(prepare 准备状态)--->binlog--->redo log(commit 提交状态)?

假设执行顺序是 redolog(提交)- binlog

发生异常重启的状况,导致数据日志丢失

  • binlog日志丢失:对于一个数据库来说,当数据写入了(redolog记录到),但是没有写入记录(binlog没记录到)。相当于一个数据库只有数据,没有该数据的记录,一致性出错!
  • redolog日志丢失:对于一个数据库来说,当数据没有写入(redolog没记录到),但是却有记录(binlog记录到)。相当于对一个数据库来说,该数据有记录,但是查不到。

因此这也是为什么增删改语句的时候,执行顺序是:

redo log(prepare 状态)--->binlog--->redo log(commit状态),

这个时候发生了异常重启会怎么样呢? 这个就要依赖于 MySQL 的处理机制了,MySQL 的处理过程如下:

  • 判断 redo log的状态,如果判断是是commit状态,就立即提交。
  • 如果 redo log 只是预提交但不是 commit 状态,这个时候就会去判断 binlog 是否完整,如果完整就提交 redo log, 不完整就回滚事务。

结论:执行顺序很重要,这样执行的最终目的就是保持一致性!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/212769
推荐阅读
相关标签
  

闽ICP备14008679号