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

写mysql数据库日志的时机

数据库查询更新流程

首先不管是查询还是更新操作,客户端都会先跟 mysql 建立网络连接,并将 sql 发送到 server 层,经过分析器解析 sql 语法、优化器选择索引生成执行计划,最终给到执行器调用 InnoDB 的函数接口。

对于读操作,InnoDB 存储引擎会先检查 Buffer Pool 中是否存在所需的 B+树数据页,如果存在则直接返回数据。如果 Buffer Pool 中没有所需的数据页,则会从磁盘中读取相应的数据页加载到 Buffer Pool 中,再返回数据。同时,如果查询的数据是热点数据,还会将数据页加入到自适应哈希索引豪华套餐中,加速后续的查询。

对于写操作,则会先将数据写入 Buffer Pool,并生成相应的 Undo Log 记录,以便在事务回滚时能够恢复数据的原始状态。接下来,会将写操作记录到 Redo Log Buffer 中,这些 redo log 会周期性地写入到磁盘中的 Redo Log 文件中,就算数据库崩了,已提交的事务也不会丢失。对于辅助索引的更新操作,InnoDB 会将这些更新暂时存储在 Change Buffer 中,等到相关的索引页被读取到 Buffer Pool 时再执行实际的更新操作,从而减少磁盘 I/O,提高写入性能。同时,所有的变更都会记录到 server 层的 binlog 中,以便进行数据恢复。


问题

1. 修改时 Buffer Pool 里没有该数据,需要读盘吗?

需要先从磁盘读取。

UPDATE / DELETE 遵循"先读后写"原则:

  • 如果 Buffer Pool 中没有目标数据页,InnoDB 必须先将该页从磁盘加载到 Buffer Pool。

  • 然后在内存中的数据页上进行修改,并生成 Undo Log 和 Redo Log。

只有 INSERT 追加新页时可能不需要读原有数据页,但如果涉及唯一索引校验等,仍可能需要读盘。


2. Undo Log 是在事务执行过程中生成吗?

是的,实时生成。

每执行 INSERT、UPDATE、DELETE 时,InnoDB 会立即生成对应的 Undo Log。它的核心作用是:

  • 事务回滚:恢复数据到修改前的状态。

  • MVCC:为其他事务提供一致性读视图。

如果等到提交时才生成,事务中途回滚将无法恢复数据。


3. Redo Log 是事务提交后才生成吗?

不是,执行过程中就会生成,提交时只是刷盘。

阶段Redo Log 行为
执行阶段每次修改 Buffer Pool 时,同步将变更记录写入Redo Log Buffer(内存)
提交阶段将 Redo Log Buffer 中的内容fsync刷新到磁盘的 Redo Log 文件

目的是:即使提交后瞬间崩溃,已提交事务的修改也能通过 Redo Log 恢复,保证持久性。


4. Binlog 也是事务提交后才生成吗?

不是,执行过程中写入缓存,提交时刷盘。

  • 执行阶段:事务中的每个写操作会实时写入Binlog Cache(会话级内存缓存)。

  • 提交阶段:事务提交时,Binlog Cache 中的内容被刷新到磁盘的Binlog 文件中。


5. 辅助索引是什么?为什么延迟更新?主键索引要立即更新吗?

辅助索引(Secondary Index)

非主键索引(二级索引),如普通索引、唯一索引(非主键)。其叶子节点存储的是主键值,而非完整数据行。

为什么用 Change Buffer 延迟更新?

这是 InnoDB 的写优化

  • 修改辅助索引时,如果对应的索引页不在 Buffer Pool中,不立即发起磁盘 I/O 去读该页。

  • 而是将变更暂存到Change Buffer中,等该索引页后续被查询读入 Buffer Pool时,再合并更新。

好处:避免频繁的随机磁盘 I/O,显著提升写入性能。

主键索引需要立即更新吗?

是的,即时更新。

  • 主键索引(聚簇索引)的叶子节点就是实际数据行,数据页和主键索引页是同一个东西

  • 修改数据时数据页已被加载到 Buffer Pool(见问题 1),所以主键索引直接在内存中完成,不存在"页不在内存"的场景,因此不需要 Change Buffer。

这是一个非常关键的区分点,涉及到 InnoDB 最核心的崩溃恢复机制。

6.事务回滚只通过 Undo Log,Redo Log 不参与回滚逻辑?

回滚时到底发生了什么?

当你执行ROLLBACK时,InnoDB 的流程是:

读取 Undo Log → 获取修改前的旧值 → 用旧值覆盖当前数据页 → 标记事务为已回滚

整个过程中完全没有用到 Redo Log。Redo Log 是"单向"的——它只负责记录"我做了什么修改",不提供"如何撤销"的信息。


那 Redo Log 在回滚后记录了什么?

回滚后,Redo Log 中仍然保留着该事务原来的修改记录,同时还会新增回滚操作产生的 Redo Log

具体分为两层:

阶段Redo Log 内容说明
执行 UPDATE记录了"将页X偏移Y处的值从 A 改为 B"这是原事务的修改
执行 ROLLBACK又记录了"将页X偏移Y处的值从 B 改回 A"回滚本身也在改数据页,必须记日志

为什么回滚也要写 Redo Log?

因为回滚操作也是在修改内存中的数据页。如果回滚过程中数据库崩溃了,重启后必须能恢复这个"回滚了一半"的状态。所以回滚动作本身也必须被 Redo Log 保护。


Undo Log 是"后悔药"(回滚用),Redo Log 是"保险单"(崩溃恢复用)。

回滚时只吃后悔药,但吃药这个动作(修改数据页)也会被保险单记录下来。

http://www.cnnetsun.cn/news/2777264.html

相关文章:

  • 2026年实测10款降AI率网站推荐:免费与付费全对比,毕业论文降低ai率必看
  • 如何用LRCGET批量歌词同步工具一键解决离线音乐库歌词管理难题
  • 在Apple Silicon Mac上无缝运行Windows程序的完整指南:Whisky让你的Mac更强大
  • 目标检测调参实战:用CIOU Loss在YOLOv5/v8上提升mAP的完整流程
  • 如何在macOS上获得终极视频预览体验:QLVideo完整指南
  • 计算机小程序毕设实战-基于springboot+微信小程序的视频点播微信小程序【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 突破JSXBIN加密壁垒:Jsxer如何成为Adobe脚本开发者的得力伙伴
  • 东南亚海外仓丢件到底谁责任?5步锁定丢在哪个环节
  • Python 爬虫监控告警:日志结构化 + 异常告警 + 采集速率实时监控落地
  • 为什么硬件工程师越来越多,高水平工程师却越来越难招?
  • 如何快速掌握炉石传说自动化脚本:终极完整指南
  • 极速启动:利用快马ai在五分钟内构建jdk17特性演示原型
  • 在 Oracle EBS 中,要在同一个 OU(运营单元)下实现不同交易走不同的公司段(Company Segment / Balancing Segment),核心思路是利用 SLA(子分类账会计)
  • Python入门到精通:零基础学习指南
  • Rust特征静态与动态分发在FFI内存管理中的i-cache性能对比
  • 离散味对称性在粒子物理模型中的应用与实现
  • Unity之使用火山引擎实现文字提问流式回复
  • 滑模控制抖振抑制方案:模糊切换+自适应律的Simulink实现包
  • 移动端APP开发:MonkeyCode在 Flutter 中的应用
  • iOS背景移除终极方案:3大优势让你轻松实现专业级图像处理
  • 深入 Raft 共识协议:基于 Rust 的极简 Leader 选举与心跳维持机制实现
  • 实战避坑指南:FFmpeg处理YUV420 NV12/P010数据时,内存对齐与性能优化的那些事儿
  • Veo风格迁移部署踩坑清单:从A100到RTX 4090,6类硬件下显存溢出的5种精准定位法(含nvidia-smi实时诊断脚本)
  • 从零到交付:AI工具学习路径规划全链路拆解,含L1-L5能力跃迁评估表与动态校准机制
  • C语言开篇
  • 从502错误到丝滑pub get:一份Flutter镜像配置的防坑与自动化配置指南
  • 【课程设计/毕业设计】基于Django的本地健康宝微信小程序系统的设计与实现疫苗接种健康系统【附源码、数据库、万字文档】
  • 2000 字,讲透OGSM:从目的到方案,一套让战略真正落地的对齐框架
  • 基于高性能云原生 CNI 插件优化 K8s 调度器与节点间延迟
  • AI资本周期的转折点:从通用模型崇拜到垂直价值捕获