【MySQL篇07】:redo log日志与buffer pool详解

文章目录

  • 1. Buffer Pool 缓冲池
  • 2. redo log (重做日志)
    • redo log 的作用:
    • 为什么需要 redo log buffer?
    • 什么时候刷盘呢?
  • 3. 总结一下 redo log 和 Buffer Pool 在更新数据时的协同工作
    • 关键组件关系图
    • 刷盘完成后

1. Buffer Pool 缓冲池

首先,需要理解一个核心问题:数据库的更新操作,直接写到磁盘是非常慢的。 磁盘是机械设备,读写速度远低于内存。如果每次更新都直接写盘,数据库的性能会非常差。

为了解决这个问题,数据库引入了内存缓存的概念,也就是图中的 Buffer Pool (缓冲池)
MySQL的buffer pool图示
可以把 Buffer Pool 想象成一个高速缓存区,它存储了数据库中经常访问的数据页(数据在磁盘上是以“页”为单位存储的)。

  • 读取数据时: 如果要读取的数据页已经在 Buffer Pool 中,就直接从内存读取,速度非常快。如果不在,就需要从磁盘加载到 Buffer Pool 中,然后再从 Buffer Pool 中读取。
  • 更新数据时: 数据库并不会直接将更新后的数据写回磁盘,而是先将更新操作应用到 Buffer Pool 中的数据页上。

2. redo log (重做日志)

现在问题来了,如果数据只更新到了 Buffer Pool,还没有写回磁盘,这个时候数据库突然崩溃了,怎么办?内存中的数据就会丢失,导致数据不一致。

这就是 redo log (重做日志) 的作用。

可以把 redo log 想象成一个操作日志本,它记录了数据库的所有更新操作

  • 当你执行一个更新操作时,InnoDB 存储引擎会先将这个更新操作记录到 redo log buffer (重做日志缓存) 中。
  • 然后,再将更新应用到 Buffer Pool 中的数据页。

MySQL数据增删改时候buffer pool和磁盘的情况

这个过程非常重要:先写日志,再更新内存。 这就是所谓的 WAL (Write-Ahead Logging,先写日志) 技术

redo log 的作用:

redo log 的主要作用是 保证事务的持久性。即使数据库崩溃,只要 redo log 中的数据没有丢失,就可以通过回放 redo log 来恢复崩溃前的数据状态。

我们结合图来看整个流程:

[应用程序] ││ UPDATE user SET balance=200 WHERE id=1▼
[InnoDB引擎]├── 1. 从磁盘加载数据页到 → [Buffer Pool](内存缓冲区)├── 2. 修改Buffer Pool中的数据(产生脏页)├── 3. 记录物理修改到 → [redo log buffer](内存)└── 4. 提交事务时将redo log刷盘 → [ib_logfile](磁盘)│└── 后台线程异步将脏页刷回磁盘数据文件
  1. 磁盘加载数据放入缓冲池 :当你需要读取或修改某个数据时,如果它不在 Buffer Pool 中,会先从磁盘加载到 Buffer Pool 中。
  2. 直接更新缓存数据 :更新操作会直接作用于 Buffer Pool 中的数据页。
  3. 记录更新信息:同时,这个更新操作的信息会被记录到 redo log buffer 中。
  4. 清空 redo log buffer 刷盘到 redo 日志中:redo log buffer 中的内容会定期或在特定时机(比如事务提交时)被刷写到磁盘上的 redo log 文件中。

为什么需要 redo log buffer?

redo log buffer 就像一个临时的缓冲区,用于存放最近的 redo log 记录。先写到 buffer 中比直接写到磁盘更快。当 buffer 满了或者满足其他条件时,才会将 buffer 中的内容批量刷写到磁盘,减少了磁盘 I/O 的次数。

什么时候刷盘呢?

redo log buffer 刷盘到磁盘的时机有很多种,包括:

  • 事务提交时: 这是最常见的刷盘时机,保证了事务的持久性
  • 当 redo log buffer 空间不足时: 如果 redo log buffer 快满了,会强制刷盘。
  • 后台线程定时刷盘: InnoDB 有后台线程会定期将 redo log buffer 中的内容刷盘。
  • 正常关闭数据库时: 关闭数据库之前,会把 redo log buffer 中的内容刷盘。

3. 总结一下 redo log 和 Buffer Pool 在更新数据时的协同工作

  1. 更新操作先写到 redo log buffer
  2. 更新操作应用到 Buffer Pool 中的数据页。
  3. redo log buffer 中的内容在合适的时机刷写到磁盘上的 redo log 文件。
  4. Buffer Pool 中的脏页(被修改过但还没写回磁盘的数据页)会在合适的时机(比如后台线程、Buffer Pool 空间不足等)刷写到磁盘上的数据文件。

通过这种方式,数据库可以在保证数据持久性的同时,提高更新操作的性能,因为大部分更新操作都先在内存中完成。即使发生崩溃,也可以通过 redo log 来恢复数据。

关键组件关系图

+-------------------+    1.记录操作     +-------------------+
| redo log buffer   | <--------------  | 事务更新请求       |
| (内存日志缓存)    |                   |                   |
+-------------------+                  +--------+----------+| 2.刷日志(保证持久性)                     | 3.修改内存数据V                                        V
+-------------------+                +----------------------+
| 磁盘 redo log文件  |               | Buffer Pool          |
| (安全存储的操作记录)|               | (内存数据页)          |
+-------------------+                |                      |^                             | 4.标记为脏页          ||                             +----------------------+|                                        || 5.推进检查点(释放日志空间)               | 6.触发刷盘条件|----------------------------------------+V                                        V
+-------------------+                +----------------------+
| 磁盘数据文件       | <------------- | 后台线程刷脏页        |
| (最终持久化数据)   |  7.覆盖写数据   | (将脏页内容写入磁盘)  |
+-------------------+                +----------------------+

刷盘完成后

  • 脏页变干净:Buffer Pool 中该页标记为「非脏页」(与磁盘一致)
  • 推进检查点 (Checkpoint)
    • 系统记录:「此脏页数据已落盘,其对应的 redo log 记录可被覆盖」
    • 磁盘 redo log 文件:释放旧日志空间(循环复用)
      磁盘一致)
  • 推进检查点 (Checkpoint)
    • 系统记录:「此脏页数据已落盘,其对应的 redo log 记录可被覆盖」
    • 磁盘 redo log 文件:释放旧日志空间(循环复用)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/84534.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/84534.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt Library库系列----Serial串口

前言 每次写串口相关的功能时&#xff0c;总是需要重新写或者复制原来写过的文件&#xff0c;容易出错不说&#xff0c;这也不是码农的风格&#xff0c;所以还是得有一套自己得代码库&#xff0c;方便调用&#xff0c;又能保持神秘感。 一、开发需求 1.有个实例类&#xff1b;…

第八节:Vben Admin 最新 v5.0 (vben5) 快速入门 - 用户管理(下)

Vben5 系列文章目录 💻 基础篇 ✅ 第一节:Vben Admin 最新 v5.0 (vben5) 快速入门 ✅ 第二节:Vben Admin 最新 v5.0 (vben5) 快速入门 - Python Flask 后端开发详解(附源码) ✅ 第三节:Vben Admin 最新 v5.0 (vben5) 快速入门 - 对接后端登录接口(上) ✅ 第四节:Vben Ad…

Redis 性能瓶颈时如何处理?

当 Redis 遇到性能瓶颈时&#xff0c;需要从多个维度进行排查和优化。以下是系统化的解决方案&#xff0c;涵盖硬件、配置、数据模型、网络等关键点&#xff1a; 一、硬件资源优化 内存瓶颈 现象&#xff1a;频繁触发 OOM 或 used_memory 接近物理内存。解决&#xff1a; 升级服…

多相机三维人脸扫描仪:超写实数字人模型制作“加速器”

超写实数字人&#xff0c;又称“数字分身”&#xff0c;是以真人形象为原型构建的高仿真虚拟形象&#xff0c;按维度可分为2D数字人与3D数字人。这类数字人已广泛应用于影视制作、游戏交互、品牌直播等场景&#xff0c;其核心价值在于通过技术手段实现真人形象的数字化复刻&…

ceph 自动调整 pg_num

要让 Ceph 的 pool 自动调整 pg_num(PG 数量),你需要启用 PG autoscaler。这是从 Ceph Octopus(15.x) 开始引入的功能,能根据池的容量和对象数量自动建议或调整 pg_num,以实现负载均衡。 ✅ 一步步开启 Pool 的 pg_num 自动调整 1. 启用 PG autoscaler 模块(通常默认启…

Python Beautiful Soup 4【HTML/XML解析库】 简介

全面剖析大模型 图解大模型&#xff1a;生成式AI原理与实战 大语言模型大模型应用开发Transformer DeepSeek模型原理开发深度学习 图灵出品 大模型强化学习详解 大模型算法&#xff1a;强化学习、微调与对齐&#xff08;全彩&#xff09;详解强化学习 RLHF GRPO DPO SFT CoT D…

AI Agent开发与安全

AI Agent的核心演进 Level 1&#xff1a;LLM Agent&#xff08;聊天机器人&#xff09; 特点&#xff1a;靠提示词工程赋予人设&#xff08;如星座占卜、角色扮演&#xff09;&#xff0c;但存在幻觉问题&#xff0c;输出不可控。局限&#xff1a;娱乐性强&#xff0c;难胜任严…

NumPy玩转数据科学

本文在创作过程中借助 AI 工具辅助资料整理与内容优化。图片来源网络。 文章目录 一、引言二、NumPy 概述2.1 NumPy 的定义与发展2.2 NumPy 的重要性 三、NumPy 的多维数组支持3.1 多维数组的概念3.2 多维数组的创建与操作3.2.1 数组的创建3.2.2 数组的索引和切片3.2.3 数组的运…

【uniapp小程序开发】图表组件ucharts的使用(入门)

一、插件的安装 安装非常简单&#xff0c;打开uniapp的插件市场&#xff0c;导入到项目中即可 下载地址&#xff1a;https://ext.dcloud.net.cn/plugin?id271 二、开始实践 先看页面的效果 页面中实现了三个基本图形的展示&#xff1a;折线图、饼图和柱状图。 上图左一&a…

APISIX+etcd高可用集群部署方案详解

#作者&#xff1a;任少近 文章目录 一、背景二、部署etcd1、etcd的svc部署yaml2、Etcd 服务定义说明3、etcd的statefulset部署yaml4、Etcd 状态集&#xff08;StatefulSet&#xff09;配置说明5、查看集群状态 三、部署apisix的deployment部署1、apisix部署yaml文件2、APISIX …

Excel常用公式大全

资源宝整理分享&#xff1a;https://www.httple.net Excel常用公式大全可以帮助用户提高工作效率&#xff0c;掌握常用的Excel公式&#xff0c;让数据处理和计算工作更加便捷高效。了解公式学习方法、用途&#xff0c;不再死记硬背&#xff0c;拒绝漫无目的。 命令用途注释说…

什么是Seata?

深入解析Seata&#xff1a;分布式事务的终极解决方案 什么是Seata&#xff1f; Seata&#xff08;Simple Extensible Autonomous Transaction Architecture&#xff09;是一款开源的分布式事务解决方案&#xff0c;由阿里巴巴中间件团队于2019年1月发起并开源&#xff08;最初…

【系统规划与管理师第二版】1.3 新一代信息技术及发展

一、物联网 物联网&#xff08;IoT&#xff09;是指通过信息传感设备&#xff0c;按约定的协议将任何物品与互联网相连接&#xff0c;进行信息交换和通信&#xff0c;以实现智能化识别、定位、跟踪、监控和管理的网络。物联网主要解决物品与物品&#xff08;T2T&#xff09;、人…

在Spring Boot中自定义JSON返回日期格式的指南

在开发Spring Boot应用时&#xff0c;很多时候需要在返回的JSON数据中以特定格式显示日期和时间。例如&#xff0c;使用LocalDateTime、Date等类型的字段时&#xff0c;默认的序列化格式可能不是你期望的路径。本文将介绍如何在Spring Boot中实现控制返回JSON数据的日期格式&am…

【大数据高并发核心场景实战】 - 数据持久化之冷热分离

大数据高并发核心场景实战 - 数据持久化之冷热分离 当云计算平台的业务后台处理工单突然接入客服系统的请求洪流&#xff0c;每日新增10万工单&#xff0c;3000万主表1.5亿明细表的数据库开始呻吟——是时候请出「冷热分离」这剂退烧药了&#xff01; 一、业务场景&#xff1a;…

【AI Study】第四天,Pandas(6)- 性能优化

文章概要 本文详细介绍 Pandas 的性能优化技术&#xff0c;包括&#xff1a; 内存优化计算优化大数据处理实际应用示例 内存优化 数据类型优化 # 查看数据类型 df.dtypes# 查看内存使用情况 df.memory_usage(deepTrue)# 优化数值类型 # 将 float64 转换为 float32 df[floa…

c++系列之智能指针的使用

&#x1f497; &#x1f497; 博客:小怡同学 &#x1f497; &#x1f497; 个人简介:编程小萌新 &#x1f497; &#x1f497; 如果博客对大家有用的话&#xff0c;请点赞关注再收藏 &#x1f31e; 智能指针的使用及原理 AII&#xff08;Resource Acquisition Is Initializatio…

知识蒸馏(Knowledge Distillation, KD)

知识蒸馏&#xff08;Knowledge Distillation, KD&#xff09;是一种模型压缩与知识迁移技术&#xff0c;通过让小型学生模型&#xff08;Student&#xff09;模仿大型教师模型&#xff08;Teacher&#xff09;的行为&#xff08;如输出概率分布或中间特征表示&#xff09;&…

chatGPT 会扩大失业潮吗?

击上方关注 “终端研发部” 设为“星标”&#xff0c;和你一起掌握更多数据库知识 对于部分人而言&#xff0c;失业是必然趋势。 这不&#xff0c;身后的一测试大哥&#xff0c;自从公司解散之后&#xff0c;已经在家待业半年了。。。 自打OpenAI推出了chatGPT3.0之后&#xff…