三、一条更新SQL 是如何执行的?

​ 在数据库里面,我们说的 update 操作其实包括了更新、插入和删除。更新流程和查询流程有什么不同呢?

​ 基本流程也是一致的,也就是说,它也要经过解析器、优化器的处理,最后交给执行器。

​ 区别就在于拿到符合条件的数据之后的操作。

​ 首先,在 InnoDB 里面有个内存的缓冲池(buffer pool)。我们对数据的更新,不会每次都直接写到磁盘上,因为 IO 的代价太大了,所以先写入到 buffer pool 里面。内存的数据页和磁盘数据不一致的时候,我们把它叫做脏页。

​ InnoDB 里面有专门的把 buffer pool 的数据写入到磁盘的线程,每隔一段时间就一次性地把多个修改写入磁盘,这个就叫做刷脏。

​ 这里面就有一个问题,如果在脏页还没有写入磁盘的时候,服务器出问题了,内存里面的数据丢失了。或者是刷脏刷到一半,甚至会破坏数据文件。所以我们必须要有一个持久化的机制。

redo log

​ InnoDB 引入了一个日志文件,叫做 redo log(重做日志),我们把所有对内存数据的修改操作写入日志文件,如果服务器出问题了,我们就从这个日志文件里面读取数据,恢复数据——用它来实现事务的持久性。

redo log 有什么特点?

1.记录修改后的值,属于物理日志

2.redo log 的大小是固定的,前面的内容会被覆盖,所以不能用于数据回滚/数据恢复。

3.redo log 是 InnoDB 存储引擎实现的,并不是所有存储引擎都有。

binlog

​ MySQL Server 层也有一个日志文件,叫做 binlog,它可以被所有的存储引擎使用。

​ binlog 以事件的形式记录了所有的 DDL 和 DML 语句(因为它记录的是操作而不是数据值,属于逻辑日志),可以用来做主从复制和数据恢复。

主从复制

数据恢复

​ 跟 redo log 不一样,它的文件内容是可以追加的,没有固定大小限制。

​ 有了这两个日志之后,我们来看一下一条更新语句是怎么执行的:

​ 例如一条语句:update teacher set name=‘jim’ where name =‘666’

​ 1、先查询到这条数据,如果有缓存,也会用到缓存。

​ 2、把 name 改成jim,然后调用引擎的 API 接口,写入这一行数据到内存,同时记录 redo log。这时 redo log 进入 prepare 状态,然后告诉执行器,执行完成了,可以随时提交。

​ 3、执行器收到通知后记录 binlog,然后调用存储引擎接口,设置 redo log 为 commit 状态。

​ 4、更新完成。

​ 问题:为什么要用两阶段提交(XA)呢?

​ 举例:

​ 如果我们执行的是把 name 改成jim,如果写完 redo log,还没有写 bin log 的时候,MySQL 重启了。

​ 因为 redo log 可以恢复数据,所以写入磁盘的是jim。但是 bin log 里面没有记录这个逻辑日志,所以这时候用 binlog 去恢复数据或者同步到从库,就会出现数据不一致的情况。

​ 所以在写两个日志的情况下,binlog 就充当了一个事务的协调者。通知 InnoDB 来执行 prepare 或commit 或者 rollback。

​ 简单地来说,这里有两个写日志的操作,类似于分布式事务,不用两阶段提交,就不能保证都成功

一个事务的协调者。通知 InnoDB 来执行 prepare 或commit 或者 rollback。

​ 简单地来说,这里有两个写日志的操作,类似于分布式事务,不用两阶段提交,就不能保证都成功或者都失败。

Mysql学习宝典(二) -- 从更新语句执行流程引出的Mysql各种日志相关推荐

  1. 详解MySQL的逻辑架构和SQL语句执行流程

    文章目录 1. 逻辑架构 1.1 连接层 1.2 服务层 1.3 引擎层 1.3.1 InnoDB 存储引擎 1.3.2 MyISAM 存储引擎 1.3.3 其他存储引擎 1.4 存储层 3. SQL ...

  2. MySQL学习之一条SQL更新语句的执行

    文章目录 前言 一.MySQL更新操作大致流程 二.redo log介绍 三.binlog介绍 四.MySQL更新操作的具体流程 前言 今天我们通过一条SQL更新语句,了解MySQL的日志系统 一.M ...

  3. Mysql学习笔记(二)——表格及数据的插入

    Mysql学习笔记(二)--表格及数据的插入 文章目录 Mysql学习笔记(二)--表格及数据的插入 1.Mysql常用指令 2.创建表格 A.数据类型 B.完整性约束条件 3.查看表格 4.修改表格 ...

  4. MySQL学习宝典之最全的常用语法语句

    MySQL学习宝典 MySQL引言 1.登录MySQL数据库 一.数据库操作相关 二.表相关 三.数据相关 四.约束 五.主键约束+自增 六.注释 七.事务 八.数据库数据类型 九.数据库导入导出 十 ...

  5. MySQL学习记录 (二) ----- SQL数据查询语句(DQL)

    相关文章: <MySQL学习记录 (一) ----- 有关数据库的基本概念和MySQL常用命令> <MySQL学习记录 (二) ----- SQL数据查询语句(DQL)> &l ...

  6. MySQL学习记录 (四) ----- SQL数据管理语句(DML)

    相关文章: <MySQL学习记录 (一) ----- 有关数据库的基本概念和MySQL常用命令> <MySQL学习记录 (二) ----- SQL数据查询语句(DQL)> &l ...

  7. MySQL——update 语句执行流程

    图1 update语句执行流程 从 Buffer Pool(内存中) 中查看是否有这条数据,没有就从磁盘中加载到缓冲池,然后对这行记录加独占锁: 把更新行记录的旧值写入 undo log(以便回滚): ...

  8. oracle菜鸟学习之 复杂的更新语句使用

    oracle菜鸟学习之 复杂的更新语句使用 实例与答案 问题:表T1里有a,b,c...N个字段,表T2里有a,b,c三个字段,然后想在T1中"c"与表T2中"c&quo ...

  9. MySQL学习(一)——常用语句

    1. 登录和退出MySQL服务器 # 登录MySQL mysql -u [用户名] -p[对应用户名密码] $ mysql -u root -p12345612# 退出MySQL数据库服务器 exit ...

最新文章

  1. C#进行Visio二次开发之电气线路停电分析逻辑
  2. pythonselenium浮动框_python上selenium的弹框操作实现
  3. 设计模式之工厂模式(Factory)(3)
  4. Apache(4)——配置文件里的各参数(2)
  5. 【Jmeter篇】jmeter+Ant+Jenkins接口自动化测试集成之报告优化(三)
  6. qt中关于坐标的说明
  7. [ImportNew]Java线程面试题
  8. java设计模式之创建型设计模式
  9. 如何评价一个RPC框架的性能
  10. ubuntu 搜索推荐安装的NVIDIA驱动版本
  11. DB2中不同于其它数据库的操作
  12. java 序列化,流,二进制的区别和联系
  13. setValuesForKeysWithDictionary崩溃
  14. Armbian搭建本地Gitea服务器
  15. FFMpeg编译之路
  16. 吉大计算机专业排名2018,吉林大学2019年排名第10位 与2018年排名持平
  17. PyCharm使用cxfreeze的方法
  18. spf13/viper
  19. 微信授权登录报错40029
  20. 按键精灵+大漠插件简单数字验证码识别实践笔记

热门文章

  1. Android tint颜色渲染
  2. 广州市天河区2021-2022学年七年级第一学期期末考试英语试题
  3. CAN(FD)记录仪在新能源汽车整车控制器(VCU)、电池管理系统(BMS)、电机控制器(MCU)、发动机ECU中的应用,免去出差烦恼
  4. CCNA_VTP协议
  5. Java学习总结——类和对象
  6. Python3下Web下载媒体小工具(常用来下B站视频)
  7. 计算机科学 江西二本大学排名,江西大学排名_江西二本大学排名
  8. TextView使用textApperance属性设置字体颜色失效
  9. MTK Fuel Gauge算法分析
  10. 【.Net】exe加密/加壳工具.Net Reactor