一条更新语句的执行过程和查询语句类似,更新的流程涉及两个日志:redo log(重做日志)和binlog(归档日志)。比如我们要将ID(主键)=2这一行的值加(c:字段)1,SQL语句如下:

  1. update T set c=c+1 where ID=2;
  • redo log

  重做日志是InnoDB引擎特有的,是物理日志,记录在“某个数据页上做了什么修改“。大小是固定,可以进行配置大小。假如我们配置一组4个文件,图中write pos是当前记录的位置,往后推移并且循环;checkpoint是当前要擦除的位置,移动规律和前者一样。两者之间的位置可以记录新的操作

如果write pos 追上checkpoint,就移动checkpoint擦除一些记录。所以即使数据可以发生异常重启,InnoDB也可以保证之前提交的记录不会丢,这就是MySQL的crash_safe能力。

  • binlog

  归档日志是MySQL的server层的实现的,所有引擎都可以使用。binlog记录的是sql语句的原始逻辑,比如根剧'id'字段查询所有的信息;相比redo log的循环写入,binlog是追加写的,binlog文件写到一定大小后会切换到下一个,不会覆盖以前的日志。

Binlog有两种模式,statement 格式的话是记sql语句, row格式会记录行的内容,记两条,更新前和更新后都有。

上述语句在InnoDB中的执行流程如下:深色代表在执行器中执行的,浅色是在存储引擎中。

最后写入redolog分为了prepare和commit两步,用来保证两个日志写入的一致性,这就是“两阶段提交”。比如我们执行“update T set status = 1“时:

  • 如果写入redolog成功,但写binlog失败,重启恢复时,数据库发现没有commit,那么事务本身回滚;备份恢复时没有binlog,数据库里的status值不变。
  • 如果在commit失败,重启恢复时redolog和binlog一致,重新commit;备份恢复时有binlog,直接恢复。

总的来说binlog记录了对数据库所有的逻辑操作,可以通过binlog来备份出一份完全相同的库;因为redolog是InnoDB引擎特有的,如果使用其他引擎,那么就要依赖binlog来记录操作。

思考一个问题:定期全量备份的周期“取决于系统重要性,有的是一天一备,有的是一周一备”。那么在什么场景下,一天一备会比一周一备更有优势呢?或者说,它影响了这个数据库系统的哪个指标?

一天一备,那么如果需要恢复数据的话,只要保证当天的binlog完整即可;一周一备的话就要保证一周的binlog完整;同时频繁全量备份需要更多存储空间,如何选择取决于业务的重要性,对应的指标是RTO(目标恢复时间)。

一条update SQL语句是如何执行的的更多相关文章

  1. springboot+Mybatis+MySql 一个update标签中执行多条update sql语句

    Mysql是不支持这种骚操作的,但是不代表并不能实现,只需要在jdbc配置文件中稍微做一下修改就行. driver=com.mysql.jdbc.Driver url=jdbc:mysql://127 ...

  2. 大型面试现场:一条update sql执行都经历什么?

    导读 Hi,大家好!我是白日梦!本文是MySQL专题的第 24 篇. 今天我要跟你分享的MySQL话题是:"从一条update sql执行都经历什么开始,发散开一系列的问题,看看你能抗到第几 ...

  3. 一条 SQL 语句是如何执行的

    一条 SQL 语句是如何执行的 SQL查询语句 select * from user where ID=10; MySQL 的基本架构可以分为 Server 层和存储引擎两部分.Server 层又包含 ...

  4. MySQL的EXPLAIN命令用于SQL语句的查询执行计划

    MySQL的EXPLAIN命令用于SQL语句的查询执行计划(QEP).这条命令的输出结果能够让我们了解MySQL 优化器是如何执行SQL 语句的.这条命令并没有提供任何调整建议,但它能够提供重要的信息 ...

  5. SQL语句完整的执行顺序(02)

    这是对SQL语句完整的执行顺序(01)的补充: 数据库是mysql,使用的数据库表名称是my_student. 表的完整数据信息是: 完整语法是: Select [select选项] 字段列表[字段别 ...

  6. 查看SQL语句的真实执行计划

    DBMS_XPLAN包中display_cursor函数不同于display函数,display_cursor用于显示SQL语句的真实的执行计划,在大多数情况下,显示真实的执行计划有助于更好的分析SQ ...

  7. 单表:SQL语句关键字的执行顺序

    表和数据: -- 创建表 CREATE TABLE `person` ( `id` ) NOT NULL AUTO_INCREMENT, `name` ) NOT NULL, `age` ) ', ` ...

  8. SQL 语句是如何执行的

    SQL 语句是如何执行的,虽然SQL是声明式语言,我们可以像使用英语一样使用它,不过在RDBMS(关系型数据库管理系统)中,SQL的实现方式还是有差别的.极客教程从数据库的角度来思考一下SQL是如何被 ...

  9. SQLServer中SQL语句与可执行二进制语句

    SQLServer可以执行正常SQL语句也可以执行被转换的二进制语句,一般会用此方法进行数据库注入操作,骗过基本的字符过滤 --将二进制格式转为普通SQL语句 ) = 0x53454C45435420 ...

随机推荐

  1. MySql Oracle SqlServer 数据库的数据类型列表

    Oracle数据类型 一.概述  在ORACLE8中定义了:标量(SCALAR).复合(COMPOSITE).引用(REFERENCE)和LOB四种数据类型,下面详细介绍它们的特性. 二.标量(SCA ...

  2. 08 . Python3高阶函数之迭代器、装饰器

    Python3高阶函数之迭代器.装饰器 列表生成式 推导式就是构建比较有规律的列表,生成器. 孩子,我现在有个需求,看列表[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],我要求你把列表里 ...

  3. 动态ip服务器 动态ip服务器的连接方式

    动态IP服务器指的是在需要的时候才进行随机IP地址分配的服务器.所谓动态就是指当你每一次上网时,电信会随机分配一个IP地址,服务器作为我们设为的大脑,拥有自己独立的账户及密码,通过远程连接动态IP服务 ...

  4. 小谢第10问:前端JS下载文件、表格

    对于小型文件及表格下载,一般采用a标签形式 <buttonb @click="downloadTemplate()">模板下载</button> downl ...

  5. jchdl - GSL Wire

    https://mp.weixin.qq.com/s/4w_wwwCd6iBhh0QR2wK81Q   org.jchdl.model.gsl.core.datatype.net.Wire.java ...

  6. Java实现蓝桥杯历届试题分考场

    历届试题 分考场 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 n个人参加某项特殊考试. 为了公平,要求任何两个认识的人不能分在同一个考场. 求是少需要分几个考场才能满足条件. 输 ...

  7. opencl(4)命令队列

    1:创建命令队列 cl_command _queue  clCreateCommandQueue( cl_context context,   //上下文 cl_device_id device,   ...

  8. Centos6.5--svn搭建

    0x01 配置好镜像源安装svn yum install subversion -y 0x02 安装完成之后在/opt下面新建一个svn的目录,当然也可以在其他的地方建立svn目录,这个看个人爱好. ...

  9. Cookie默认不设置path时,哪些请求会携带cookie数据

    默认不设置path的时候,只会在请求和servlet同路径的情况下才会携带cookie中存储的数据,包含同级目录和下级目录 例如: 在http://localhost:8080/day01/test/ ...

  10. numpy.random.randn()与numpy.random.rand()的区别

    numpy中有一些常用的用来产生随机数的函数,randn()和rand()就属于这其中. numpy.random.randn(d0, d1, …, dn)是从标准正态分布中返回一个或多个样本值. n ...