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

【mysql 第三篇章】一条 update语句是怎么持久化到磁盘上的?

首先看一下这个 SQL 语句你会不会写? 下面是说明执行这个 SQL 语句,数据库底层做了什么操作。

    update users set name='xxx' where id=10;

在引擎要执行更新语句的时候,比如更新 id=10 这行数据时,他会先查看数据在缓冲池中是否存在,如果缓冲池中没有,会直接从磁盘中加载到缓冲池中,而且会对这行数据添加独占锁。

在这里插入图片描述

接着上面的继续,假设 id=10 这行数据的 name 原来是 zhangsan,现在要更新为 xxx,那么此时我们的先把要更新的原来的值 zhangsanid=10,写入到 undo 日志文件中。

在这里插入图片描述

当数据从磁盘中加载数据到内存,然后将旧的数据写入到undo文件中之后,这个时候就会开始更新缓冲池中的数据,这个时候的数据是脏数据。因为这个时候还没有将更新后的数据持久化到磁盘上。

在这里插入图片描述

上面已经把内存中的数据更新了,还没将数据持久化到磁盘上,但是这个时候如果数据库宕机,数据就会丢失,这个时候数据又出现了redo log buffer内存区域,将你修改的数据存放在这个里面。比如:name=xxx 这个就会存在里面。如果事务没有提交的话,数据库宕机了 redo log buffer也会丢失。其实这个时候是没有关系的,这个时候如果重启数据库,数据其实还是没有修改之前的数据。

在这里插入图片描述

事务提交将 redo 日志写入到磁盘中,利用 innodb_flush_log_at_trx_commit 配置策略来将 redo 数据持久化到硬盘上

  • 参数是0:
    • 这个时候是不会将数据持久化到硬盘上的。
  • 参数是1:
    • 这个时候一定会将数据持久化到磁盘上,即使还没持久化到硬盘上的时候数据库宕机了,但是当数据库重启时,会根据redo将数据持久化到硬盘上。
  • 参数时2:
    • 这个时候会将数据存到 os cache 中,如果这个时候数据库宕机了。数据还是会丢失。
http://www.lryc.cn/news/420058.html

相关文章:

  • 深入探索大模型:从基础到实践,开启AI之旅
  • 题解:力扣1567 - 返回乘积为正数的最长子数组
  • 009 | 上证50ETF基金数据分析及预测
  • Wakanda: 1靶场复现【附代码】(权限提升)
  • 内核函数调试
  • Spring IOC使用DButil实现对数据库的操作
  • Android14音频进阶调试之命令播放mp3/aac非裸流音频(八十)
  • vue中怎么自定义组件
  • BM1反转链表[栈+头插法]
  • VisionPro二次开发学习笔记10-使用 PMAlign和Fixture固定Blob工具检测孔
  • 学单片机怎么在3-5个月内找到工作?
  • 探索设计模式:观察者模式
  • gradio之持续输入,持续输出(流式)
  • Git 常用命令指南:从入门到精通
  • Camera驱动 汇总表【小驰行动派】
  • SSRS rdlc报表 九 在.net core中使用RDLC报表
  • 力扣(2024.08.10)
  • Django-文件上传
  • [Meachines] [Easy] valentine SSL心脏滴血+SSH-RSA解密+trp00f自动化权限提升+Tmux进程劫持权限提升
  • 利用单张/多张图内参数标定 OpenCV Python
  • The Llama 3 Herd of Models 第7部分视觉实验部分全文
  • 亚信安慧AntDB-T:使用Brin索引提升OLAP查询性能以及节省磁盘空间
  • web渗透测试常用命令
  • Kylin系列(二)使用
  • CI/CD——CI持续集成实验
  • 2.4 大模型数据基础:预训练阶段数据详解 ——《带你自学大语言模型》系列
  • Kali Linux——网络安全的瑞士军刀
  • UML建模-测试用例
  • Python知识点:如何使用Socket模块进行网络编程
  • 培训第二十一天(mysql用户创建与授权、角色创建)