赞
踩
解决数据一致性问题!
以下都是官方解释:【这是因为最开始 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
发生异常重启的状况,导致数据日志丢失
因此这也是为什么增删改语句的时候,执行顺序是:
redo log(prepare 状态)--->binlog--->redo log(commit状态),
这个时候发生了异常重启会怎么样呢? 这个就要依赖于 MySQL 的处理机制了,MySQL 的处理过程如下:
结论:执行顺序很重要,这样执行的最终目的就是保持一致性!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。