当前位置: 首页 > news >正文

MySQL 部分知识点理解-1 通过语句的执行详解日志文件

以 InnoDB 引擎为例,一条UPDATE语句的执行过程可以清晰地分为Server 层存储引擎层两大阶段

一 、Server 层:SQL 解析与调度

这一层由 MySQL 自身处理,负责将 SQL 文本转换为可执行的指令。

  1. 连接器接收请求

    • 客户端通过网络连接(Connector)将 SQL 语句发送到 MySQL 服务器。
    • 服务器进行身份验证和权限检查,确认用户有权限执行该更新操作。
  2. 解析与优化

    • 解析器(Parser):将 SQL 文本转换成语法树(AST),检查语法是否正确,看数据库,表,列是否存在等。
    • 优化器(Optimizer):根据WHERE条件,选择最优的执行计划,例如决定使用哪个索引来快速定位要更新的行。
  3. 执行器(Executor)

    • 根据优化器生成的计划,调用 InnoDB 存储引擎的API接口(如update_row()),开始执行真正的数据更新操作。

二 、InnoDB 存储引擎层:数据更新与日志记录

  • 定位数据页

    • 根据索引(如主键索引)快速定位到要更新的行所在的数据页。
    • 如果该数据页已经在内存的Buffer Pool中,则直接使用;否则,从磁盘的.ibd文件中加载到内存。
  • 加锁与并发控制

    • 在修改数据前,InnoDB 会对该行加上行锁(Record Lock),防止其他事务同时修改,保证事务隔离性。
    • 如果没有合适的索引,可能会升级为表锁或使用 Next-Key Lock。
  • 写 Undo Log(回滚日志)

    • 记录更新前的 “旧值”,例如age25变为20,就记录age=25
    • 作用:保证事务的原子性,如果事务失败,可以通过 Undo Log 回滚到修改前的状态。
  • 更新内存数据(Buffer Pool)

    • 直接修改内存中Buffer Pool里的数据页,将新值写入。此时,内存中的数据和磁盘上的不一致,该页被标记为 “脏页”。
    • 注意:数据不会立即写入磁盘,这是为了提升性能。
  • 写 Redo Log(重做日志)

    • 将更新操作记录到Redo Log Buffer,然后在合适时机(如事务提交)刷入磁盘。
    • 作用:保证数据持久性(WAL 技术)。即使数据库崩溃重启,也能通过 Redo Log 恢复内存中未刷盘的脏页数据。
  • 事务提交与两阶段提交

    • 当执行COMMIT时,为了保证 Redo Log 和 Binlog 的一致性,InnoDB 采用两阶段提交
      1. Prepare 阶段:将 Redo Log 刷盘并标记为prepare状态。
      2. 写 Binlog:将更新的逻辑操作(如 “更新了哪一行,改成了什么”)写入 Binlog(二进制日志),并刷入磁盘。Binlog 用于主从复制和数据恢复。
      3. Commit 阶段:将 Redo Log 标记为commit状态,事务正式完成。
  • 脏页刷盘(异步)

    • 事务提交后,脏页仍在内存中。后台的Checkpoint线程会在系统负载较低时,将这些脏页异步地刷新到磁盘的.ibd文件中,完成数据的持久化。

下面举个例子: 非常完整的步骤

InnoDB 中 UPDATE 语句的「正确执行顺序」以UPDATE 表 SET a=1 WHERE id=2;为例:

  • 事务启动 + 权限校验(Server 层):连接器连接客户端,获取SQL语句,确认用户有更新权限,开启事务。
  • 定位数据 + 获取行锁(存储引擎层):通过索引找到 id=2 的行,加行锁(防止并发修改)。
  • 写入 Undo Log(存储引擎层):记录 id=2 的 a 列旧值 N,存入 Undo Log(内存 + 磁盘),用于事务回滚。
  • 修改内存数据(存储引擎层):在 Buffer Pool 中,将 id=2 的 a 列值改为 1,该数据页标记为脏页(内存与磁盘不一致)。
  • 写入 Redo Log Buffer(存储引擎层):将 “修改 id=2 的 a 列为 1” 的操作写入 Redo Log Buffer(内存)。(当事务启动时,MySQL 会为该事务分配一个唯一标识符。在事务执行过程中,每次对数据进行修改,MySQL 都会生成一条 Redo Log,记录修改前后的数据状态。这些 Redo Log 首先会被写入内存中的 Redo Log Buffer。)
  • Redo Log 刷盘(Prepare 阶段)(存储引擎层):在事物执行过程(这就是事物提交的过程中实现的——注意这是个过程)中持续写入,将 Redo Log Buffer 中的内容刷新到磁盘上的 Redo Log 文件中,标记 Redo Log 状态为prepare,确保操作可追溯。
  • 写入并刷盘 Binlog(Server 层):将更新操作的逻辑写入 Binlog(二进制日志),并刷入磁盘(主从复制、数据恢复依赖)。
  • Redo Log 标记为 Committed(存储引擎层):将 Redo Log 的状态从 prepare 改为commit,事务提交正式完成。
  • 释放行锁 + 异步刷脏页(存储引擎层):释放行锁,后台 Checkpoint 线程异步将 Buffer Pool 中的脏页刷入磁盘,完成数据持久化。(因此redo log是为了恢复“已提交但未刷盘”的数据 ——原因就是将redo log日志刷盘 再将数据刷盘,因此数据丢失可以通过redo log再找回)

先锁行 → 写 Undo → 改内存数据 → 写 Redo(prepare)刷盘→ 写 Binlog刷盘 → 改 Redo(commit)→脏页数据写入磁盘

注意:

1.为保证两种日志的一致性,防止主从复制和事务状态不一致,innodb 采用了两阶段提交策略。这就是为什么在 Redo Log(prepare)之后、Redo Log(commit)之前,必须写入并刷盘 Binlog,只有这样才能保证 Redo Log 和 Binlog 的一致性。

2.只有当 Redo Log 成功写入磁盘,事务才算真正提交成功。

下面是redo log binlog undo log 的区别:(有不少坑)

redo log 记录物理日志,即数据页的具体修改,redo log 和 undo log 都是 InnoDB 存储引擎实现的。 redo log 是循环写入的,空间是固定的,当文件写满后会覆盖最早的记录,仅保存未刷盘的脏页日志,已持久化的数据会被清除。

binlog 记录的是逻辑日志,包括原始的 SQL 语句或者行数据变化,binlog 属于 Server 层,与存储引擎无关,无法直接操作物理数据页。同时binlog 是追加写入的,文件写满后会新建文件继续写入,不会覆盖历史日志,保存的是全量操作记录;

undo log 是逻辑逆向操作日志,记录的是数据修改之前的值,方便恢复到事务开始前的状态。

binlog 会记录整个 SQL 或行变化;redo log 是为了恢复“已提交但未刷盘”的数据,undo log 是为了撤销未提交的事务。

当 MySQL 崩溃重启时,会先检查 Redo Log。对于已提交的事务,MySQL 会重放 Redo Log 中的记录,即数据库崩溃后重启,Redo Log 会「正向重做」所有已提交事务的修改(保证持久性),但不是“反向回退” 任何操作,就是把修改重新应用到数据页。

对于未提交的事务,MySQL 会通过 Undo Log 回滚(就是撤销事务内的所有修改),确保数据恢复到崩溃前的一致性状态。

Binlog 不参与本地崩溃重启的恢复,但负责 “跨机器、跨时间” 的数据一致性保障。

Binlog 记录的是「数据修改的逻辑操作。只记录 “执行了什么 SQL”,本身没有 “回退” 能力。

想要通过 Binlog 恢复数据,需要解析 Binlog 生成反向 SQL。正常的适用场景:主从同步、误操作后的数据恢复(仅靠 Redo/Undo Log 完全无法恢复)、数据库迁移。

http://www.jsqmd.com/news/501790/

相关文章:

  • 2026年远传水表一线品牌优选解析 - 深度智识库
  • 2026过程工业电动执行器厂家推荐:三大趋势下的解决方案型企业选型指南 - 速递信息
  • JavaSE自学笔记(黑马)
  • 初步认识JVM虚拟机的内存结构~
  • 造相-Z-Image入门指南:如何评估Z-Image生成图像的商业可用性(版权/伦理)
  • 项目管理进阶——详解项目经理应知应会的8大绩效域和12项原则【附全文阅读】
  • AIGlasses_for_navigation效果展示:多角度拍摄下盲道方向一致性分割验证
  • 天猫超市卡回收全攻略,轻松换现不浪费! - 团团收购物卡回收
  • 2026年3月深圳展厅设计公司怎么选?展馆工程、数字展厅、企业展厅一站式服务商盘点 - 海棠依旧大
  • 2026年移民咨询公司推荐:香港移民、香港投资、巴拿马、多米尼克、圣基茨、圣多美 - 讯息观点
  • list集合常踩坑
  • 人脸识别OOD模型效果展示:对抗样本攻击下OOD质量分骤降的防御价值
  • 2026年温州AI搜索营销公司深度观察:从技术到效果的实战派选择指南 - 小白条111
  • 2026年3月广东刚性防水、柔性防水、人防密闭、电气套管厂家优选:基于市场数据的五家核心供应商深度评测与选型指南 - 2026年企业推荐榜
  • SpringBoot 数据库访问层深度实践:JPA+MyBatis-Plus双ORM
  • GESP认证C++编程真题解析 | 202603 六级
  • 小型全自动裁切机:开启高效裁切新时代 - 工业设备
  • 2026年仿石漆生产厂家权威推荐:十大品牌技术驱动下的行业新格局! - 深度智识库
  • LeetCode HOT100 - 多数元素
  • 【RH134总结】 四
  • 使用uv下载并上传到私有仓库(支持python版本修改)
  • 2026年黑龙江口碑好的钢制护士站制造商推荐,专业定制化服务全解析 - mypinpai
  • 大理婚纱照首选推荐|芙拉薇尔:在风花雪月里,定格专属山海浪漫 - 江湖评测
  • 2026软文推广平台实测榜:传声港新媒体平台如何重构营销生态 - 博客湾
  • OpenFoam常用命令
  • 【愚公系列】《剪映+DeepSeek+即梦:短视频制作》010-剪辑:把碎片素材串联成片(速度与节奏)
  • 327万人才缺口!网络安全专业薪资曝光:这些高校毕业即拿高薪(女生也适合)
  • 分析2026年江苏实力强的屋顶防水品牌企业,怎么选择 - 工业推荐榜
  • RebCoord版本管理
  • 2026年玉米加工设备推荐:河南成立粮油机械有限公司,玉米生产线/制粉/提胚设备全系供应 - 品牌推荐官