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

news/2025/1/15 17:25:46/

首先看一下这个 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.ppmy.cn/news/1508819.html

相关文章

C++:类与对象(下)

再探构造函数 构造函数体赋值与初始化列表 其实之前我们实现构造函数时,初始化成员变量主要使⽤函数体内赋值,构造函数初始化还有⼀种⽅式,就是初始化列表,C规定初始化列表的使⽤⽅式是以 ⼀个冒号开始,接着是⼀个以逗…

为RPC服务增加异步日志模块

在实际开发过程中我们不可能将一些错误信息或是提示信息全部打印到屏幕上,而是将这些信息输送到日志中去。但是存在着一个问题,写日志是在磁盘中写日志,是磁盘的io操作,效率会很慢,致使项目的效率降低。 为了解决这一个…

从零开始构建霸王餐返利APP的技术路线与挑战

从零开始构建霸王餐返利APP的技术路线与挑战 大家好,我是阿可,微赚淘客系统及省赚客APP创始人,是个冬天不穿秋裤,天冷也要风度的程序猿! 在电商领域,霸王餐返利APP作为一种新兴的商业模式,为用…

jq8900-16p代码索引

jq8900-16p代码索引: JQ8900.c #include "stm32f10x.h" #include "delay.h" #include "JQ8900.h"void Init_One_line_Uart(void) {GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitStruct…

LeetCode_sql_day16(601.体育馆的人流量)

描述:601. 体育馆的人流量 - 力扣(LeetCode) 编写解决方案找出每行的人数大于或等于 100 且 id 连续的三行或更多行记录。 返回按 visit_date 升序排列 的结果表。 输入Stadium表: ----------------------------- | id | visit_date | peop…

【OpenCV-Python实战项目】01-OCR文本检测

OpenCVTesseract文本检测 0.介绍1.基础功能实现1.1 字符检测1.2 单词检测1.3 只检测数字 2.工程应用2.1 封装类2.2 屏幕截图识别2.3 视频文本检测(待优化) 3.参考 0.介绍 (1)Tesseract是一个开源文本识别 (OCR)引擎,是…

JavaScript高阶笔记总结第三天:(JavaScript高阶完结)

Xmind鸟瞰图: 简单文字总结: js高阶笔记总结: 严格模式: 1.开启严格模式:"use strict" 2.不使用var关键字声明会报错 3.严格模式下普通函数的this指向undefined 高阶函数: 满足…

JS【详解】 延迟加载

动态创建标签 动态创建的 <script > let script document.createElement("script"); script.src "path/to/script.js"; document.body.appendChild(script);动态创建的 <img> let img new Image(); img.src path/to/image.jpg; img.onlo…