MySQL-事务SQL如何执行?

475 阅读2分钟

“这是我参与更文挑战的第3天,活动详情查看: 更文挑战

先介绍一下mysql数据库架构

第一层:网络连接层。

第二层:服务器层。

第三层:存储引擎层。 

2012_02_06_02.png

201906171146022.png

MySQL架构本身有分为三层,网络连接层, sql层, 存储引擎层, 而网络连接层与sql层合称server层,故mysql又分server层合储存引擎层。

描述一个事务SQL执行的完成过程?

1》⼀个事物语句SQL⾸先经过⽹络连接层进⾏ 链接的⽹络认证、连接池获取链接和线程池获取线程

2》经过SQL层记录binlog buffer(未落盘,这需要看数据刷盘策略)。

⽤户传⼊sql——查询缓存(命中缓存可直接返回结果 mysql8.0删除了)——解析器(⽣成sql解 析树)——预处理器(可能sql等价改写)——查询优化器(⽣成sql执⾏计划)----查询执⾏引擎---- 结果返回给⽤户。

3》经过存储引擎层主要对MySQL中数据的存储和提取,需要记录redo buffer,undo buffer。 关于buffer如何刷盘需要看具体引擎 innodb中,数据刷盘的规则只有⼀个:checkpoint。 (commit动作后也会刷⽇志到磁盘) 其中MySQL 5.6默认的值为75,即当超过缓冲池的百分之75后, 就强制刷⼀部缓冲数据到磁盘。redoLog 中会记录逻辑序列号。(LSN称为⽇志的逻辑序列号(log sequence number),data page也会保存逻辑序列号。

4》如果回滚事务,执⾏undo log逻辑⽇志。

5》如果提交事务,则进⾏刷盘。

6》事务提交前发⽣故障点。重启innodb的时候进⾏恢复操作。 正常关闭还是异常关闭重启innodb的时候会进⾏恢复操作

7》通过Redolong进⾏恢复,Redolong记录数据⻚的物理变化恢复速度⽐逻辑⽇志(如⼆进制⽇志) 要快很多(事务⽇志具有幂等性,所以多次操作得到同⼀结果的⾏为在⽇志中只记录⼀次。⽽⼆进 制⽇志不具有幂等性,多次操作会全部记录下来,在恢复的时候会多次执⾏⼆进制⽇志中的记录, 速度就慢得多)

8》恢复过程 Innodb 通过checkpoint已经完整刷到磁盘上data page上的LSN, ⽤数据⻚的逻辑号判断Redolog记录中序列号,如果⼩于从redolog中恢复。 宕机前正处于checkpoint的刷盘过程,且数据⻚的刷盘进度超过了⽇志⻚的刷盘进度。这时候宕 机,数据⻚中记录的LSN就会⼤于⽇志⻚中的LSN,这时超出⽇志进度的部分将不会重做。