MySQL是怎么保证持久性的(redo log日志相关)

Mysql中 事务的很多实现,都是因为有日志的支撑,比如binlog、undo log、redo log等 

MySQL是怎么保证持久性的

持久性是指,事务一旦提交,它对数据库的改变就应该是永久性的,接下来的其他操作或故障不能对其有影响。InnoDB 中主要是通过 redo log 来保证事务的持久性。

redo log(重做日志),记录的是事务提交时数据页的物理修改,作用是为了保障在进行脏页刷新时而出现错误所造成的持久性的问题!

redo log 是 InnoDB 独有的,记录的是某个数据页做了什么修改,每执行一个事务就会产生相应的 redo log。当事务提交时,只需将 redo log 持久化到磁盘即可,可以暂时不考虑将 Buffer Pool 里的脏页写回,而是在合适的时机交给后台线程去做。系统故障崩溃时,MySQL 也可以在重启之后利用 redo log 里的内容恢复数据。

其中还用到了 WAL 技术。

WAL(Write Ahead Logging-先写日志) 的关键点在于 MySQL 的写操作并不是立刻写到磁盘上,而是先写日志,然后在合适的时间再写到磁盘上。具体来说,当有一条记录需要更新时,InnoDB 引擎会先把物理修改记录写到redo log里【即在commit后会立即将redolog Buffer中redo log的日志信息刷新到磁盘中的redo log file(重做日志文件)中】,这个时候整个记录的更新就算完成了。后续,InnoDB 引擎会在适当的时候,由后台线程将缓存在 Buffer Pool 里的脏页刷新到磁盘里,这个时候往往也是系统空闲的时候,以减少对用户线程的影响。

有了 redo log,当系统崩溃时,即使脏页的数据还没来得及持久化,但 redo log 已经持久化了,MySQL 就可以根据 redo log 里记录的内容,将所有的数据恢复到最新状态,整个过程也就是常说的 crash-safe 能力。

redo log日志文件由两部分构成:

- 重做日志缓冲(redo log buffer)   ---存在内存中

- 重做日志文件(redo log file)     ---存在磁盘中

下面详细阐述一下该过程:

首先用户开启事务,进行一系列的DML(增、删、改)的操作。会先去看内存结构中的缓冲池(Buffer Pool)中是否有要操作的数据,如果有直接操作。

如果没有要先用后台线程将数据从磁盘中读取出来缓存到缓冲池(Buffer Pool)中,然后DML(更新或删除)操作的就是缓冲池中的数据。

操作完缓冲池中的数据后,会立即记录当前事务中的物理修改信息(数据页物理变化)到内存结构中的重做日志缓冲区Redolog Buffer中,

相关说明 :

  • MySQL的Buffer Pool是一个内存区域,用于缓存数据页,从而提高查询性能。读写过程涉及到数据的从磁盘到内存的读取,以及在内存中的修改和写回磁盘。
  • 操作完缓存池中的数据后,数据发生变更,但磁盘中的数据未变,这种数据叫做"脏页",后续需要后台线程找个时机刷新到磁盘中,完成数据的持久化

但是需要注意的是,脏页写回磁盘是由一个后台线程进行的,在MySQL服务器空闲或负载较低时,InnoDB会进行脏页刷盘,以减少对用户线程的影响,降低对性能的影响。

当事务commit提交后,不会立即将该操作后的"脏页"直接刷新到磁盘中,而是等待一定的频率统一将脏页刷新到磁盘中去,保证缓冲池中的数据和磁盘中数据的一致性。

有了redo log后,commit后虽然不会直接刷新到磁盘中,但是在内存结构中的Redolog Buffer会记录事务中的物理修改信息(即数据页变化),在commit后会立即将redolog Buffer中redo log的日志信息刷新到磁盘中的redo log file(重做日志文件)中,持久化的保存在磁盘文件中。

              

这样的话,在一段时间后,Buffer Pool里的脏页刷新到 磁盘的过程中,即使出错了,那么也可以通过磁盘中的redo log file日志文件来进行数据恢复,保证 数据的持久化!

  • 后来脏页中的数据页顺利刷新到磁盘当中后,那么磁盘中的redo log的一些记录信息就没用了。所以每隔一段时间,就会去清理redo log日志!
  • redo log日志文件中有两个文件,这两个文件是循环写的!循环写 就是日志的空间大小是固定的,写满 就需要先刷新脏页,然后继续从头写。

总结:redo log是为了保障在进行脏页刷新时而出现错误所造成的持久性的问题!

思考:

为什么用户commit后,不直接将缓冲池中修改的数据页(脏页)直接刷新回磁盘?

答: 直接将脏页刷新回磁盘,存在严重的性能问题。因为很多DML语句操作数据页的时候,都是随机的。直接操作磁盘,这属于大量的随机磁盘IO。

而commit的时候都是先将redo log日志文件刷新到磁盘中,是因为它是日志文件,日志文件都是追加的形式。这是一种顺序的磁盘IO。效率更高!这种机制叫做 WAL(writting - ahead - logging)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux/Windows 安装 RocketMQ 详细图文教程!

Linux 安装 RocketMQ 首先,你需要从RocketMQ的官方网站或GitHub仓库下载最新的RocketMQ发行版下载安装,官网下载地址:https://rocketmq.apache.org/download/。 接下来配置环境变量: 输入vim /etc/profile命令配置环境变量输入i进…

【动态规划】| 路径问题之不同路径 力扣62

🎗️ 主页:小夜时雨 🎗️ 专栏:动态规划 🎗️ 如何活着,是我找寻的方向 目录 1. 题目解析2. 代码 1. 题目解析 题目链接: https://leetcode.cn/problems/unique-paths/description/ 通常动态规划的题目有…

牛客little w and Discretization

玩一下样例发现,只要找到mex就可以知道有((1-mex)的值)所在的位置离散化后和原本的值是一样的,所以询问区间的长度-(1-mex)有几个值就是答案,数据范围3e5,莫队值域分块求区间mex,计算1-mex有几个位置属于这…

51单片机-实机演示(LED点阵)

目录 前言: 一.线位置 二.扩展 三.总结 前言: 这是一篇关于51单片机实机LED点阵的插线图和代码说明.另外还有一篇我写的仿真的连接在这:http://t.csdnimg.cn/ZNLCl,欢迎大家的点赞,评论,关注. 一.线位置 接线实机图. 引脚位置注意: 1. *-* P00->RE8 P01->RE7 …

孟德尔随机化R包:TwoSampleMR和MR-PRESSO安装

1. 孟德尔随机化R包 看一篇文章,介绍孟德尔随机化分析,里面推荐了这两个R包,安装了解一下: Methods:Genome-wide association study (GWAS) data for autoimmune diseases and AMD were obtained from the IEU Open GWAS databas…

C#客户端

控件 打开链接 Socket socket; // 打开连接 private void button1_Click(object sender, EventArgs e) {button1.Enabled false;button2.Enabled true;//1 创建socket客户端对象socket new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);// 2…

鸿蒙轻内核A核源码分析系列四(2) 虚拟内存

本文我们来熟悉下OpenHarmony鸿蒙轻内核提供的虚拟内存(Virtual memory)管理模块。 本文中所涉及的源码,以OpenHarmony LiteOS-A内核为例,均可以在开源站点 https://gitee.com/openharmony/kernel_liteos_a 获取。如果涉及开发板…

鸿蒙开发文件管理:【@ohos.environment (目录环境能力)】

目录环境能力 该模块提供环境目录能力,获取内存存储根目录、公共文件根目录的JS接口。 说明: 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。本模块接口为系统接口,三方应用不支…

SLT简介【简单介绍SLT】

SLT简介 在c的学习当中STL的学习是一个很重要的一环,但是STL又是一个庞大的章节,因此这里我们先简单介绍一下STL,有助于后面我们对STL的学习,这里就是做一个简单的介绍,并无干货。 1.什么是STL STL(standard templa…

【Emacs Verilog mode保姆级的使用指南】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

Python | Leetcode Python题解之第145题二叉树的后序遍历

题目&#xff1a; 题解&#xff1a; class Solution:def postorderTraversal(self, root: TreeNode) -> List[int]:def addPath(node: TreeNode):count 0while node:count 1res.append(node.val)node node.righti, j len(res) - count, len(res) - 1while i < j:res…

微软如何打造数字零售力航母系列科普13 - Prime Focus Technologies在NAB 2024上推出CLEAR®对话人工智能联合试点

Prime Focus Technologies在NAB 2024上推出CLEAR对话人工智能联合试点 彻底改变您与内容的互动方式&#xff0c;从内容的创建到分发 洛杉矶&#xff0c;2024年4月9日/PRNewswire/-媒体和娱乐&#xff08;M&E&#xff09;行业人工智能技术解决方案的先驱Prime Focus Techn…

【docker】compose 使用 .env 文件

在 Docker Compose 中&#xff0c;你可以使用 .env 文件来定义环境变量&#xff0c;这些变量可以在 docker-compose.yml 文件中被引用。这允许你轻松地管理配置&#xff0c;而不需要硬编码值到你的 Compose 文件中。 以下是如何在 Docker Compose 中使用 .env 文件的步骤&…

Qt C++ TCP服务端响应多客户端通讯

本示例使用的设备&#xff1a;WIFI无线4G网络RFID云读卡器远程网络开关物流网阅读器TTS语音-淘宝网 (taobao.com) #include "mainwindow.h" #include "ui_mainwindow.h" #include "QMessageBox" #include <QDebug> #include <exceptio…

qemu创建kvm虚拟机-x86模拟arm

1、虚拟机环境 虚拟机ubuntu22.042、下载需要的依赖 apt install openssh-server net-tools vim -yapt install qemu qemu-kvm qemu-system-arm bridge-utils uml-utilities qemu-efi-aarch64 cloud-image-utils -y#查看版本 qemu-img -V(1) 下载uefi固件 cd /optwget https…

[大模型]LLaMA3-8B-Instruct Lora 微调

本节我们简要介绍如何基于 transformers、peft 等框架&#xff0c;对 LLaMA3-8B-Instruct 模型进行 Lora 微调。Lora 是一种高效微调方法&#xff0c;深入了解其原理可参见博客&#xff1a;知乎|深入浅出 Lora。 这个教程会在同目录下给大家提供一个 nodebook 文件&#xff0c…

服务器如何远程桌面连接不上,服务器远程桌面连接不上解决办法

服务器远程桌面连接不上&#xff0c;是IT运维中常见的挑战之一。针对这一问题&#xff0c;专业的解决方法通常涉及以下几个方面的排查与操作&#xff1a; 首先&#xff0c;我们需要检查网络连接是否正常。远程桌面连接依赖于稳定的网络连接&#xff0c;因此&#xff0c;确认服务…

【云原生】创建harbor私有仓库及使用aliyun个人仓库

1.安装docker #删除已有dockersystemctl stop docker yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine #安装docker yum install -y docker-ce-20.10.1…

企业级开源项目,云缓存解决方案:CacheCloud

CacheCloud&#xff1a;简化缓存管理&#xff0c;释放数据潜力- 精选真开源&#xff0c;释放新价值。 概览 CacheCloud是由搜狐视频团队开发的一款开源的Redis缓存云平台&#xff0c;支持Redis多种架构(Standalone、Sentinel、Cluster)高效管理、有效降低大规模redis运维成本&…

8.transformers量化

Transformers 核心设计Auto Classes Transformers Auto Classes 设计:统一接口、自动检索 AutoClasses 旨在通过全局统一的接口 from_pretrained() ,实现基于名称(路径)自动检索预训练权重(模 型)、配置文件、词汇表等所有与模型相关的抽象。 灵活扩展的配置AutoConfig…