02 | 日志系统:一条SQL更新语句是如何执行的?

redo log 和 bin log

redo log 是innodb引擎特有,当有一条记录需要更新时,innodb先把记录写到redo log中,并更新内存,此时更新完成,

同时,innodb会在适当的时候把这个操作记录更新到磁盘中。

binlog(归档日志)是server层的日志

这两种日志有以下三点不同:

redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。

redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=2 这一行的 c 字段加 1 ”。

redo log 是循环写的,空间固定会用完;binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。

mysql> update T set c=c+1 where ID=2;

1 prepare阶段 2 写binlog 3 commit
当在2之前崩溃时
重启恢复:后发现没有commit,回滚。备份恢复:没有binlog 。
一致
当在3之前崩溃
重启恢复:虽没有commit,但满足prepare和binlog完整,所以重启后会自动commit。备份:有binlog. 一致

1.?先客户端通过tcp/ip发送?条sql语句到server层的SQL interface

2.SQL interface接到该请求后,先对该条语句进?解析,验证权限是否匹配

3.验证通过以后,分析器会对该语句分析,是否语法有错误等

4.接下来是优化器器?成相应的执?计划,选择最优的执?计划

5.之后会是执?器根据执?计划执?这条语句。在这?步会去open table,如果该table上有MDL,则等待。 如果没有,则加在该表上加短暂的MDL(S) (如果opend_table太?,表明open_table_cache太?。需要不停的去打开frm?件)

6.进?到引擎层,?先会去innodb_buffer_pool?的data dictionary(元数据信息)得到表信息

7.通过元数据信息,去lock info?查出是否会有相关的锁信息,并把这条update语句需要的 锁信息写?到lock info?(锁这?还有待补充)

8.然后涉及到的?数据通过快照的?式存储到innodb_buffer_pool?的undo page?,并且记录undo log修改的redo (如果data page?有就直接载?到undo page?,如果没有,则需要去磁盘?取出相应page的数据,载?到undo page?)

9.在innodb_buffer_pool的data page做update操作。并把操作的物理数据?修改记录到redo log buffer? 由于update这个事务会涉及到多个??的修改,所以redo log buffer?会记录多条??的修改信息。 因为group commit的原因,这次事务所产?的redo log buffer可能会跟随其它事务?同flush并且sync到磁盘上

10.同时修改的信息,会按照event的格式,记录到binlog_cache中。(这?注意binlog_cache_size是transaction级别 的,不是session级别的参数, ?旦commit之后,dump线程会从binlog_cache?把event主动发送给slave的I/O线程)

11.之后把这条sql,需要在?级索引上做的修改,写?到change buffer page,等到下次有其他sql需要读取该?级索 引时,再去与?级索引做merge (随机I/O变为顺序I/O,但是由于现在的磁盘都是SSD,所以对于寻址来说,随机I/O和顺序I/O差距不?)

12.此时update语句已经完成,需要commit或者rollback。这?讨论commit的情况,并且双1

13.commit操作,由于存储引擎层与server层之间采?的是内部XA(保证两个事务的?致性,这?主要保证redo log 和binlog的原?性), 所以提交分为prepare阶段与commit阶段

14.prepare阶段,将事务的xid写?,将binlog_cache?的进?flush以及sync操作(?事务的话这步?常耗时)

15.commit阶段,由于之前该事务产?的redo log已经sync到磁盘了。所以这步只是在redo log?标记commit

16.当binlog和redo log都已经落盘以后,如果触发了刷新脏?的操作,先把该脏?复制到doublewrite buffer?, 把doublewrite buffer?的刷新到共享表空间,然后才是通过page cleaner线程把脏?写?到磁盘中 ?师,你看我的步骤中有什么问题嘛?我感觉第6步那?有点问题,因为第5步已经去open table了,第6步还有没有 必要去buffer?查找元数据呢?这元数据是表示的系统的元数据嘛,还是所有表的?

原文地址:https://www.cnblogs.com/lakeslove/p/12237541.html

时间: 2024-10-09 00:55:08

02 | 日志系统:一条SQL更新语句是如何执行的?的相关文章

MySQL数据库详解(二)一条SQL更新语句是如何执行的?

? 前面我们系统了解了一个查询语句的执行流程,并介绍了执行过程中涉及的处理模块.相信你还记得,一条查询语句的执行过程一般是经过连接器.分析器.优化器.执行器等功能模块,最后到达存储引擎. 那么,一条更新语句的执行流程又是怎样的呢?之前你可能经常听 DBA 同事说,MySQL 可以恢复到半个月内任意一秒的状态,惊叹的同时,你是不是心中也会不免会好奇,这是怎样做到的呢? 我们还是从一个表的一条更新语句说起,下面是这个表的创建语句,这个表有一个主键 ID 和一个整型字段 c: mysql> creat

Mysql实战45讲学习详情----一条SQL更新语句是如何执行的?

相关词语: redo log:日志模块(临时记录,类似于便签),InnoDB 引擎特有日志 WAL(Write-Ahead Logging):写入方式 binlog:日志模块(归档日志),Server 层的日志 crash-safe:redo log带来的好处(MySQL 可以恢复到固定时间内任意一秒的状态) WAL执行过程(redo log日志的存储方式): write pos 是当前记录的位置,checkpoint 是当前要擦除的位置,它们之间的是“便签”上还空着的部分.如果 write p

一条SQL查询语句是如何执行的

一条SQL查询语句是如何执行的 下面是MySql的基本架构示意图,从图中可以清楚地看到SQL语句在MySQL的各个功能模块中的执行过程. 大体来讲,MySQL可以分为Server层和存储引擎层两部分. Server层 Server层包括连接器.查询缓存.分析器.优化器.执行器等,涵盖了MySql的大多数核心服务功能以及所有的内置函数,所有跨存储引擎的功能都在这一层实现,比如存储过程.触发器.视图等. 存储引擎层 而存储引擎层负责数据的存储与提取.其架构模式是插件式的,支持InnoDB.MyISA

C# 执行多条SQL更新语句,实现数据库事务

class Program { class Result<T> { public T data; public string Message; public bool Success; public string StackTrace; } struct ExecuteableUnit { public string SQL; public SqlParameter[] param; } /// <summary> /// 执行多条SQL语句,实现数据库事务. /// </s

一条SQL查询语句是如何执行的?

本篇文章将通过一条 SQL 的执行过程来介绍 MySQL 的基础架构. 首先有一个 user_info 表,表里有一个 id 字段,执行下面这条查询语句: select * from user_info where id = 1; 返回结果为: +----+----------+----------+--------+------+---------------------+---------------------+ | id | username | password | openid |

深入理解SQL原理:一条SQL查询语句是如何执行的?

本篇文章将通过一条 SQL 的执行过程来介绍 MySQL 的基础架构. 首先有一个 user_info 表,表里有一个 id 字段,执行下面这条查询语句: select * from user_info where id = 1; 返回结果为: +----+----------+----------+--------+------+---------------------+---------------------+ | id | username | password | openid |

01基础架构,一条SQL查询语句是如何执行的?

SQL 语句在 MySQL 的各个功能模块中的执行过程. 大体来说,MySQL 可以分为 Server 层和存储引擎层两部分. Server 层包括连接器.查询缓存.分析器.优化器.执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期.时间.数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程.触发器.视图等. 存储引擎层负责数据的存储和提取.其架构模式是插件式的,支持 InnoDB.MyISAM.Memory 等多个存储引擎.现在最常用的存储引擎是 In

[lua, mysql] 将多条记录数据组合成一条sql插入语句(for mysql)

-- 演示将多条记录数据组合成一条sql插入语句(for mysql) function getTpl0(tname) -- 获取表各个字段 local t = { tpl_pack = {"packId","itemId","`group`","num","rate","rateType"}, } for k, v in pairs(t) do if tname == k then r

SQL Select语句完整的执行顺序

SQL Select语句完整的执行顺序: 1.from子句组装来自不同数据源的数据: 2.where子句基于指定的条件对记录行进行筛选: 3.group by子句将数据划分为多个分组: 4.使用聚集函数进行计算: 5.使用having子句筛选分组: 6.计算所有的表达式: 7.select 的字段:8.使用order by对结果集进行排序.SQL语言不同于其他编程语言的最明显特征是处理代码的顺序.在大多数据库语言中,代码按编码顺序被处理.但在SQL语句中,第一个被处理的子句式FROM,而不是第一