“这是我参与更文挑战的第3天,活动详情查看: 更文挑战”
先介绍一下mysql数据库架构
第一层:网络连接层。
第二层:服务器层。
第三层:存储引擎层。
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,这时超出⽇志进度的部分将不会重做。