mysql innodb引擎执行更新和查询命令详细过程
2020-03-08 12:39
95 查看
必须结合日志系统详解的博客搭配看不然根本看不懂更本无法理解!!!
1.mysql 执行查询命令
mysql 执行更新命令
1. 执行器先找引擎取 ID=2 这一行。ID 是主键,引擎直接用树搜索找到这一行。如果 ID=2 这一行所在的数据页本来就在内存中,就直接返回给执行器;否则,需要先从磁盘读入内存,然后再返回。 2. 执行器拿到引擎给的行数据,把这个值加上 1,比如原来是 N,现在就是 N+1,得到新的 一行数据,再调用引擎接口写入这行新数据。 3. 请注意此时引擎并没有写入磁盘中,而是引擎将这行新数据更新到内存中,同时将这个更新操作记录到 redo log 里面,此时 redo log 处于 prepare 状态。然后告知执行器执行完成了,随时可以提交事务。 4. 执行器生成这个操作的 binlog,并把 binlog 写入磁盘。 5. 执行器调用引擎的提交事务接口,引擎把刚刚写入的 redo log 改成提交(commit)状 态,更新完成。
由图可知redo 日志存在两个不同的阶段 (两阶段提交) prepare commit 状态
写入了binlog再commit
重点理解二个提交阶段prepare 和 commit
不要被二个日志给带歪了,从二个提交状态来理解。
我们来说一下,如果重启会不会带来问题:
1.在写入redolog处于prepare阶段后,还没来的及写binlog时重启 只要处于prepare状态,mysql重启后发现是prepare状态的数据,就会认为是无效数据,所以不会产生影响 2.redolog处于prepare阶段,binlog也写完并写入磁盘,此时还没commit就重启。 这个时候redolog是prepare, binlog也已经完整了,Mysql重启后,认为认可这一个事务,会提交掉。
二个阶段提交有大作用
不只是误操作后需要用这个过程来恢复数据。当你需要扩容的时候,也就是需要再 多搭建一些备库来增加系统的读能力的时候,现在常见的做法也是用全量备份加上应用 binlog 来实现的,这个“不一致”就会导致你的线上出现主从数据库不一致的情况。
简单说,redo log 和 binlog 都可以用于表示事务的提交状态,而两阶段提交就是让这两个状态 保持逻辑上的一致。
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- [MySQL生产环境] Innodb存储引擎内存报警问题处理过程
- mysql select 执行过程查询关键字 explain
- 详解用SELECT命令在MySQL执行查询操作的教程
- 【mysql】SQL嵌套子查询和相关子查询的执行过程有什么区别(推荐)
- Innodb存储引擎查询输出分析(包括查询过程do_select()函数)
- mysql存储引擎InnoDB插入数据的过程详解
- Mysql 将结果保存到文件 从文件中执行sql语句 记录操作过程(tee 命令的使用)
- mysql 再执行删除,更新操作包含子查询时出错
- mysql innodb引擎--范围查询优化
- mysql 存储过程:提供查询语句并返回查询执行影响的行数
- JAVA执行mysql脚本和mysql相关命令(alter table示例/多表更新/Insert Into Select/多表查询) 及ibatis模糊查询(concat用法)
- MySQL查询执行过程
- MySQL 执行 建表命令时 type='innodb' 报错
- MySQL查询的执行过程
- mysql 常用命令,连接数据库,查看建表语句,批量导入数据,批量更新数据,连接查询
- C# 连接数据库MySql并执行查询命令
- MySQL查询执行过程
- MySQL存储过程实例——实现查询数据表,有则更新无则插入
- 【mysql】SQL嵌套子查询和相关子查询的执行过程有什么区别(推荐)