Mysql的Update的执行流程是怎么样的?

我们知道Mysql分Server层和存储引擎层。Server层负责处理连接,解析,执行等。引擎层负责数据的读写。

执行流程

所以大概的执行流程也分Server层和引擎层

1,Server层

  • 建立客户端连接,验证用户权限。
  • 若启用缓存,会检查是否命中
  • 分析器进行语法,词法的分析
  • 优化器选择最优执行计划
  • 执行器调用引擎层接口处理

2,引擎层

  • 数据定位,通过索引(如主键)定位目标行,若数据页不在内存,则从磁盘加载
  • 加锁与日志记录,加排他锁,防止并发修改。将旧数据写入Undo Log日志,用于回滚与MVCC的多版本并发控制。写入Binlog记录逻辑变更。
  • 修改数据并提交
  • 释放锁资源

UPDATE过程中bin日志,redo log日志,undo log日志是怎么记录的?

首先我们需要知道每种日志的作用是什么样的。

一、Binlog(二进制日志)

记录方式
  • 逻辑日志:记录的是“逻辑操作”(如UPDATE users SET name='John' WHERE id=1;),而不是物理页的修改。

  • 写入时机

    • 在事务提交时,由MySQL Server层的执行器写入。

    • 两阶段提交(2PC)的第二阶段(Commit阶段)持久化。

  • 存储格式

    • STATEMENT:记录原始SQL语句。

    • ROW:记录实际修改的行数据(默认模式)。

    • MIXED:混合模式,由MySQL自动选择。

作用
  1. 主从复制:从库通过重放Binlog实现数据同步。

  2. 数据恢复:通过mysqlbinlog工具解析Binlog,恢复误操作数据。

  3. 审计:记录所有数据变更操作。


二、Redo Log(重做日志)

记录方式
  • 物理日志:记录的是数据页的物理修改(例如“将页号为3的页中偏移量100的位置写入值’John’”);

  • 写入时机

    • 在事务执行过程中,由InnoDB存储引擎实时写入(顺序写入)。

    • 分为两个阶段:

      1. Prepare阶段:事务修改前,先写入Redo Log(状态为Prepare)。

      2. Commit阶段:事务提交时,将状态改为Commit

  • 存储结构

    • 循环写入,文件固定大小(如ib_logfile0ib_logfile1)。

作用
  1. 崩溃恢复:MySQL宕机后,通过重放Redo Log将未刷盘的脏页恢复。

  2. Write-Ahead Logging (WAL):确保数据修改先写日志再写磁盘,提升性能(避免随机写)。

  3. 保证持久性:即使宕机,已提交事务的修改不会丢失。


三、Undo Log(回滚日志)

记录方式
  • 逻辑日志:记录修改前的旧值(例如id=1的原值name='Alice')。

  • 写入时机

    • 在事务修改数据前,由InnoDB生成Undo Log。

    • 存储在Undo Tablespace(MySQL 8.0默认独立存储)。

  • 存储结构

    • 链式结构:多个事务的Undo Log通过指针连接,支持多版本控制(MVCC)。

作用
  1. 事务回滚:事务失败时,通过Undo Log恢复旧值。

  2. MVCC(多版本并发控制)

    • 为其他事务提供一致性读视图(ReadView)。

    • 例如,在REPEATABLE READ隔离级别下,其他事务读取的是Undo Log中的旧版本数据。

  3. 避免脏读:未提交事务的修改对其他事务不可见。

日志记录的过程

  1. 事务开始

    用户执行UPDATE users SET name='John' WHERE id=1;

  2. Undo Log记录旧值

    InnoDB将id=1的原数据(name='Alice')写入Undo Log。

  3. Redo Log(Prepare阶段)

    将数据页的物理修改写入Redo Log,状态为Prepare

  4. Binlog写入

    执行器将逻辑操作(UPDATE语句或行变更)写入Binlog。

  5. Redo Log(Commit阶段)

    事务提交时,将Redo Log状态改为Commit

  6. 提交完成

    释放行锁,数据页在Buffer Pool中标记为脏页,异步刷盘。

执行UPDATE过程中,MYSQL崩溃,重启后MySQL是如何处理的?

如果MySQL在写入Binlog后突然宕机:

  1. 重启时发现Redo Log状态为Prepare且存在对应的Binlog。

  2. 根据两阶段提交规则,重放Redo Log完成事务提交。

如果未写入Binlog就宕机:

  1. Redo Log状态为Prepare但没有对应的Binlog,事务会被回滚。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值