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

本文详细介绍了数据库中的更新操作,包括InnoDB的缓冲池、脏页处理、重做日志(redolog)和二进制日志(binlog)。在更新SQL执行过程中,涉及到两阶段提交,确保redolog和binlog的一致性,以防止数据不一致和提供事务持久性。binlog记录逻辑日志,用于主从复制和数据恢复,而redolog作为物理日志,用于事务恢复。

三、一条更新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。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

carl的分享笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值