【Mysql】数据更新过程redo log、脏页 到磁盘文件

news2024/11/19 22:51:57

简介

Mysq 执行一条SQL记录时,会首先将数据写入 redo log,然后更新到内存上,等到满足特定条件之后,才将数据写入到数据库磁盘文件。

redo log也保存在磁盘上,和数据库磁盘文件的区别,在于写入的方式。redo log的写入方式是顺序的,而数据库磁盘文件则是随机的。对于磁盘来说,顺序写入比随机写入更快。

这种分两次更新的方式,类似于redis 数据落库的方式,只不过操作的存储结构不同,造成了不同的结果。Redis中 写入数据时,会先写入aof_buf,然后根据 appendfsync 的值不同,选择是每次写入物理磁盘文件,还是按照间隔时间,分批写入。

相关术语

redo log,mysql 日志的一种存储在磁盘上,被用来恢复crash造成的事务丢失。

脏页,mysql 引擎上的缓存,用来缓存更新数据,加速读取,避免每次都从磁盘文件上读取。

磁盘文件,mysql 实际存储数据的物理结构。

三种存储机制的写入

Mysql 的 redo log机制保障了一旦数据写入了 redo log,那么后续就不会因为各种问题造成数据丢失。即使极端情况下,数据库宕机,也能通过读取redo log的方式,将数据恢复过来,并将对应数据写入到磁盘中。

这种redo log先于数据写入到磁盘的技术,被叫做 WAL(write ahead log,提前写日志)。

当然由于数据库除了要写入实际保存数据之外,还需要写入这样的一份 redo log,磁盘写的压力会增大。所有Mysql 也有其他的技术来降低写压力,比如说 随机写改成顺序写、单次写内存后批量更新到磁盘。

在这里插入图片描述

Redo log 的写入

当Mysql 需要执行一条 Update 语句时,InnoDB 引擎会先将记录写入到 redo log 中,并更新内存,这个时候更新就完成了。至于磁盘的写入,InnoDB 引擎会在适当的时候将操作记录更新到磁盘中,这个更新往往是系统比较空闲的时候,或者不得不更新的时候。

每个InnoDB 存储引擎至少有一个 redo log 文件组,多个 redo log文件。如果将文件组配置成 一组 4 个,每个redo log 文件大小是 1GB,那么 redo log的大小就可以记录 4GB的操作。InnoDB 引擎会将这组日志文件,从头开始写入,每次写到末尾时,又重新回到开头进行循环写。

在这里插入图片描述

如上图所述,环中有两个标识节点:

write pos 和 check point,write pos时当前记录的位置,check point 是当前数据更新的位置,这个数据更新指将记录更新到数据文件中。

write pos 和 check point 中间的间隔就是还可以写入的空间,而当 write pos 追上 check point 时,就表示 redo log 已经存满了,不能保存新的记录了,得停下来先将记录保存到数据文件中。

脏页到磁盘的写入

脏页是一种内存数据页,脏页的’脏’ 在于脏页上的数据和磁盘数据页上的内容不一样。

从脏页到磁盘的写入有四种:

当redo log写满了,会将 check point 向后推进一些。此时,会将check point 对应脏页 都flush 到磁盘上。
当系统内存不足时,需要淘汰一些内存数据页。如果被选中的是脏页,那也需要flush 到磁盘上。
当系统空闲时,Mysql 会主动将一些脏页 flush 到磁盘上。
Mysql 正常关闭时,会将内存上的脏页都flush 到磁盘上。

当脏页还没有被刷入磁盘,数据库就崩溃时,这时就需要做崩溃恢复。它的具体流程是从check point开始向后扫描日志,然后让redo log 更新内存内容。更新完成之后,内存变成脏页,最终再在合适的时候将脏页数据写盘。

总结

Mysql 数据更新时会从 redo log 到 脏页,最后由脏页更新到数据文件。所以之前用redo log 做数据恢复是一种比较宽泛的说法。

同时对Mysql 数据更新过程 和 Redis、RocketMQ 做数据持久化过程的比较也可以看出,对于这种逻辑数据转物理数据的方案也是殊途同归,利用计算机特性对数据写入做优化。

参考

02 | 日志系统:一条SQL更新语句是如何执行的?

阿里巴巴大淘宝技术:如何设计一套完整的订单系统,或者完整的业务流程?

阿里云数据库开源:MySQL WAL那些事儿

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

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

相关文章

asp.net+sqlserver企业财务管理系统

1 系统概述5 1.1 研究的背景5 1.2 研究的意义5 1.3 主要研究内容6 2 系统开发环境6 2.1开发工具介绍6 2.1.1 Visual Studio介绍6 2.1.2 SQL Server介绍7 2.1.3 IIS介绍8 2.2 动态网站技术介绍8 2.3开发模式B/S介绍8 3 需求分析9 3.1 需求分析9 3.1.1系统用户需求9 3.1.2系统功能…

Vue学习笔记2 - Vue常用指令

上一章 【Vue学习笔记2 -naxVue是什么 】讲了Vue的基本概念。 本章来学习一下Vue常用指令。 1,v-text 绑定文本 2,v-html 绑定 html 3,v-for for循环 4,v-show 显示/隐藏 5,v-if/v-esle-if/v-else 条件式 6&…

open3d 源码阅读octree_*.py

目录 1. 从点云中创建octree 2. 从体素网格中创建octree 3. 遍历octree 1. 从点云中创建octree octree_find_leaf.py convert_from_point_cloud 建立octree,查询点云中某个点在octree中哪个叶子节点。 # --------------------------------------------------…

Redis(连接池)

SpringBoor环境下使用redis连接池 依赖&#xff1a; <dependencies><dependency><groupId>com.yugabyte</groupId><artifactId>jedis</artifactId><version>2.9.0-yb-11</version></dependency><dependency><…

乘势而上,在社科大能源管理硕士项目的引领下,更上一层楼

很多人都说&#xff0c;生活的起点不重要&#xff0c;重要的是你最后抵达到哪里。进入职场的门槛后&#xff0c;我们一路过关打怪才拥有了如今的职位。在享受喜悦的同时&#xff0c;有为未来做规划吗&#xff0c;乘势而上才是明智的抉择&#xff0c;让我们在社科大能源管理硕士…

Seata 1.6.1整合SpringCloud实现分布式事务(含代码)

一、环境: seata 1.6.1spring cloud :2021.0.6spring cloud alibaba: 2021.0.4.0nacos: 2.2.1mysql: 8二、部署seata-server 2.1 启动nacos 这里不再赘述 2.2 下载seata-server 下载地址:https://seata.io/zh-cn/blog/download.html 下载后解压,即为seata-server端,提…

摄影测量-笔记(理解篇)

1、基本原理 基于测量中的前方交会原理。 在两个已知点上分别拍摄一张影像&#xff0c;通过人眼观测&#xff08;一只眼睛观察一张影像上的同名点a1和a2&#xff09;&#xff0c;就能得出空间对应点A的坐标。空间景物通过传感器构像&#xff0c;再用人眼观察构像的像片产生生…

GPT 学术优化版使用指南 -- GPT Academic

目录 1. 项目介绍 1.1 简介 1.2 功能说明 2. 环境配置 2.1 本地安装

STL-String容器

string本质上是一个类&#xff0c;string 类内部封装了很多成员方法 例如&#xff1a;查找find&#xff0c;拷贝copy&#xff0c;删除delete 替换replace&#xff0c;插入insert string管理char*所分配的内存&#xff0c;不用担心复制越界和取值越界等&#xff0c;由类内部进…

C++容器适配器stack和queue(含deque,priority_queue)

目录 1.容器适配器 1.1 什么是适配器 1.2 STL标准库中stack和queue底层结构 1.3 deque 1.3.1 deque原理介绍&#xff08;了解&#xff09; 1.3.2 deque优点和缺点 1.3.3 为什么选择deque作为stack和queue的底层默认容器 2. stack介绍和使用 2.1 stack介绍 2.2 stack使用 2.3 …

HTML处理控件Aspose.Html 功能演示:在 C# 中将 HTML 转换为 JPG

Aspose.Html for .NET 是一种高级的HTML操作API&#xff0c;可让您直接在.NET应用程序中执行广泛的HTML操作任务&#xff0c;Aspose.Html for .NET允许创建&#xff0c;加载&#xff0c;编辑或转换&#xff08;X&#xff09;HTML文档&#xff0c;而无需额外的软件或工具。API还…

swing基本组件用法_JTooBar

Swing提供了JTooBar类来创建工具条&#xff0c;并且可以往JTooBar中添加多个工具按钮 JToolBar API: 方法名称方法功能JToolBar(String name,int orientation)创建一个名为name&#xff0c;方向为orientation的工具条对象&#xff0c;其orientation的是取值可以是SwingConsta…

MySQL基础(九)子查询

子查询指一个查询语句嵌套在另一个查询语句内部的查询&#xff0c;这个特性从MySQL 4.1开始引入。 SQL 中子查询的使用大大增强了 SELECT 查询的能力&#xff0c;因为很多时候查询需要从结果集中获取数据&#xff0c;或者需要从同一个表中先计算得出一个数据结果&#xff0c;然…

单调队列解决滑动窗口问题

文章目录 单调队列结构解决滑动窗口问题什么是单调队列&#xff1f;[239. 滑动窗口最大值](https://leetcode.cn/problems/sliding-window-maximum/)单调队列框架滑动窗口解题框架完整的解题代码如下&#xff1a;我的实现&#xff1a; 单调队列结构解决滑动窗口问题 什么是单调…

CVE-2023-27524 Apache Superset Auth Bypass|附检测工具

漏洞描述 Apache Superset是一个开源数据可视化和探索工具。Apache Superset 版本&#xff08;包括 2.0.1&#xff09;中的会话验证攻击。没有根据安装说明更改默认配置的SECRET_KEY的安装允许攻击者验证和访问未经授权的资源。这不会影响更改了SECRET_KEY配置默认值的Superse…

JAVA快速开发框架 一键生成表单模板代码

从计算机诞生开始&#xff0c;虽然编程的形式随着硬件及软件的不断进步而不停迭代&#xff0c;但是从事计算机技术行业的人员始终与编写代码的任务紧密联系在一起。因此如何提高软件开发的效率和质量&#xff0c;一直是软件工程领域的重要问题之一。 这一方面是由于在不同软件…

MQ(面试问题简析)学习笔记

文章目录 1. 为什么使用消息队列2. 消息队列有什么优缺点3. Kafka、ActiveMQ、RabbitMQ、RocketMQ 有什么优缺点&#xff1f;4. 如何保证消息队列的高可用4.1 RabbitMQ 的高可用性4.2 Kafka 的高可用性 5. 如何保证消息不被重复消费&#xff08;如何保证消息消费的幂等性&#…

1、Cloudsim和Workflowsim仿真环境下载

1、WorkflowSim的下载和安装 workflowsim下载地址 2、Cloudsim的下载和安装 cloudsim官网 cloudsim4.0安装包地址 2、Cloudsim如何工作 Cloudsim如何工作&#xff1f;原版内容 cloudsim配置 下面这是CloudsimExamples1的代码&#xff1a; package org.cloudbus.…

论文导读 | 大语言模型上的精调策略

随着预训练语言模型规模的快速增长&#xff0c;在下游任务上精调模型的成本也随之快速增加。这种成本主要体现在两方面上&#xff1a;一&#xff0c;计算开销。以大语言模型作为基座&#xff0c;精调的显存占用和时间成本都成倍增加。随着模型规模扩大到10B以上&#xff0c;几乎…