【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 中,如果这个时候数据库宕机了。数据还是会丢失。
相关推荐
技术宝哥2 小时前
Redis(2):Redis + Lua为什么可以实现原子性
数据库·redis·lua
学地理的小胖砸3 小时前
【Python 操作 MySQL 数据库】
数据库·python·mysql
dddaidai1233 小时前
Redis解析
数据库·redis·缓存
数据库幼崽4 小时前
MySQL 8.0 OCP 1Z0-908 121-130题
数据库·mysql·ocp
Amctwd4 小时前
【SQL】如何在 SQL 中统计结构化字符串的特征频率
数据库·sql
betazhou4 小时前
基于Linux环境实现Oracle goldengate远程抽取MySQL同步数据到MySQL
linux·数据库·mysql·oracle·ogg
lyrhhhhhhhh5 小时前
Spring 框架 JDBC 模板技术详解
java·数据库·spring
喝醉的小喵6 小时前
【mysql】并发 Insert 的死锁问题 第二弹
数据库·后端·mysql·死锁
付出不多7 小时前
Linux——mysql主从复制与读写分离
数据库·mysql
初次见面我叫泰隆7 小时前
MySQL——1、数据库基础
数据库·adb