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

首先看一下这个 SQL 语句你会不会写? 下面是说明执行这个 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 中,如果这个时候数据库宕机了。数据还是会丢失。
相关推荐
人工干智能几秒前
科普:pandas 中的类 SQL语句:transaction.groupby(“card_id“)[‘purchase_day‘].diff()
数据库·sql·pandas
梦想与想象-广州大智汇几秒前
MySQL 同步数据到 ClickHouse 方案对比分析
数据库·mysql·clickhouse
雨墨✘1 分钟前
如何解决SQL多表查询数据重复问题_使用DISTINCT与JOIN优化
jvm·数据库·python
yuezhilangniao10 分钟前
centos7安装mysql57- 2026整理 mysql5.7.44
mysql
u01074754614 分钟前
JavaScript 递归调用栈深度解析与层级遍历陷阱详解
jvm·数据库·python
herinspace19 分钟前
管家婆实用帖-如何使用ping命令检测网络环境
网络·数据库·人工智能·学习·excel·语音识别
星空椰20 分钟前
Windows 安装 PostgreSQL 数据库
数据库·postgresql
Elastic 中国社区官方博客28 分钟前
用于 IntelliJ IDEA 的新 ES|QL 插件
java·大数据·数据库·ide·elasticsearch·搜索引擎·intellij-idea
疯狂成瘾者30 分钟前
LangChain Middleware 技术解析:从“插槽机制”到 Agent 运行时控制
数据库·python·langchain
七夜zippoe34 分钟前
OpenClaw 飞书深度集成:多维表格
数据库·算法·飞书·集成·openclaw