MySQL的Redo log 、Undo log、 Binlog

news2025/7/12 7:54:08

MySQL的redo log 、undo log、 binlog

redo log概念

redo log翻译过来叫重做日志,是一种保证持久化的措施,innodb存储引擎的物理日志文件

redo log是固定大小的,是循环写的过程

有了redo log之后,innodb就可以保证即使数据库发生异常重启, 之前的记录也不会丢失,叫做crash-safe

undo log概念

Undo Log是为了实现事务的原子性,在MySQL数据库InnoDB存储引擎中, 还用Undo Log来实现多版本并发控制(简称:MVCC)

操作任何数据之前,首先将数据备份到一个地方(这个存储数据备份的地方 称为Undo Log)。然后进行数据的修改。如果出现了错误或者用户执行了 ROLLBACK语句,系统可以利用Undo Log中的备份将数据恢复到事务开始之 前的状态

注意:undo log是逻辑日志,undo log记录在redo log里面,可以理解为:

  • 当delete一条记录时,undo log中会记录一条对应的insert记录
  • 当insert一条记录时,undo log中会记录一条对应的delete记录
  • 当update一条记录时,它记录一条对应相反的update记录

binlog概念

bin log是服务端的日志文件,主要做mysql功能层面的事情

与redo日志的区别:

1、redo是innodb独有的,binlog是所有引擎都可以使用的

2、redo是物理日志,记录的是在某个数据页上做了什么修改,binlog是逻 辑日志,记录的是这个语句的原始逻辑

3、redo是循环写的,空间会用完,binlog是可以追加写的,不会覆盖之前 的日志信息

数据刷盘流程

innodb是用页单位来管理存储空间的,任何的DML都会操作完整的一个页,会将整个页加载到用户态中内存下的Buffer Pool中,然后对需要修改的数据进行修改,这时数据不会立即刷新到到磁盘(目的是不浪费磁盘IO)而是通过undo log 数据备份、redo log先记录数据变化,再由异步线程把数据刷到磁盘上,这样即使系统崩溃,再恢复后,也可以根据redo日志进行数据恢复。

  1. 当发生数据修改的时候,innodb引擎会先将记录写到redo log中, 并更新内存,此时更新就算是完成了,同时innodb引擎会在合适 的时机将记录操作到磁盘中
  2. redo log 是以组的方式写入,在一个事务中,这些redo log称为一个组redo log, 组redo log具有原子性
  3. Log Buffer 16MB 每个Buffer由Block组成,每个Block块 512byte

在这里插入图片描述
在这里插入图片描述

redo log刷盘时机

通过参数innodb_flush_log_at_trx_commit控制

  1. commit的时候进行刷盘:这也是最保险的,因为如果这个时候崩溃了代表没有commit成功,因此,也不用恢复什么数据
  2. commit的时候,只是刷新近os的内核缓冲区,具体的刷盘时机不确定
  3. 后台线程,每s刷新一次到磁盘中

两阶段提交

通过redo log、和bin log来保证数据一致性,不同阶段断电情况如下

更改数据:redo log 和bin log都没有持久化,因此数据是一致的

写redo log(prepare状态):mysql重启后,首先检查redo log状态,如果有并且状态处于prepare状态,查看有没有bin log日志,有的话正常提交,没有则删除处于prepare的redo log

写binlog:mysql重启后,查看有没有bin log日志,有的话正常提交,没有则删除处于prepare的redo log

提交事务commit状态:此时走刷盘机制

事务commit成功

事务执行commit命令后,mysqld将记录了数据修改的Log Buffer写入磁盘上的redo log,然后将这部分数据的状态修改为commit,写完redo log后才算是事务提交成功,MySQL Server需要保持commit状态的数据的持久性。如果写redo log失败,数据的状态还是prepare,尽管事务执行了commit命令,这依然不算commit成功

DML完整的执行步骤

update table set column = x where id = 1;
  1. 获取数据库连接
  2. 判断id=1的这条记录在不在buffer pool中,在的话undo log备份,执行更新,否则从磁盘中加载到buffer pool中,然后进行undo log备份、更新
  3. 将这个更新操作记录到redo log中,记录的是一个物理日志。此时redo log是一个prepare状态
  4. 记录该操作的binlog,并且将binlog刷盘
  5. 提交事务,对redo log进行提交。

时redo log是一个prepare状态
4. 记录该操作的binlog,并且将binlog刷盘
5. 提交事务,对redo log进行提交。

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

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

相关文章

数据存储介绍

数据存储对象包括数据流在加工过程中产生的临时文件或加工过程中需要查找的信息。数据以某种格式记录在计算机内部或外部存储介质上。数据存储要命名,这种命名要反映信息特征的组成含义。数据流反映了系统中流动的数据,表现出动态数据的特征;…

STM32个人笔记-电源管理

笔记来源于STM32F103VET6,野火指南者,中文参考手册,HAL库开发手册和b站的野火指南者视频。观看过好多次了,但往往理解得不够全面,现记下小笔记,用来回顾。属于个人笔记。 电源监控器 STM32芯片主要通过VDD…

代码审计基础之SQL注入漏洞

1.SQL注入原理 SQL注入就是攻击者通过把恶意的SQL语句插入到Web表单的输入页面中,且插入的恶意语句会导致原有的SQL语句发生改变,从而达到攻击者的目的去让它执行一些危险的数据操作,进一步欺骗服务器去执行一些非本意的操作。 简单来讲&am…

Python BeautifulSoup4 入门使用

一、简介 BeautifulSoup4 与 lxml 一样,是一个 html 解析器,主要功能也是解析和提取数据。 BeautifulSoup4 是 爬虫 必学的技能。BeautifulSoup 最主要的功能是从网页抓取数据,Beautiful Soup 自动将输入文档转换为 Unicode 编码&#xff0c…

Verilog语言中case、casex、casez的用法和区别

casez与casex语句是case语句的两种变体, 在写testbench时用到。case 语句是一种多路条件分支的形式,可以解决 if 语句中有多个条件选项时使用不方便的问题。 一、case、casex、casez的区别 下表给出case、casex、casez的真值表: 1)在case语…

【计算机网络实验】防火墙访问控制列表实验

实验内容 防火墙访问控制列表实验 实验目的 理解访问控制列表的工作原理;了解访问控制列表的类型;学习标准访问控制列表的配置。 实验要求 1 实验拓扑图 本实验所用的网络拓扑如图1所示。 图1 ACL实验拓扑结构 2 实验步骤 Router0配置;&…

解决 npm install express 遇到的问题总结

方法1:权限 以管理员身份运行cmd执行npm install express --save命令 方法2:切换镜像源 查看镜像源 npm config get registry 如果要直接更换淘宝:npm config set registry https://registry.npmmirror.com/ 使用nrm切换 1.安装nrm npm i …

106362-34-9,(D-Ala1)-Peptide T amide

肽t的有效类似物DAPTA (aSTTTNYT-amide)在单核/巨噬细胞中显示出很强的抗hiv - 1活性,该肽抑制病毒的进入。 编号: 110545中文名称: 肽T、(D-Ala1)-Peptide T amide英文名: (D-Ala1)-Peptide T amideCAS号: 106362-34-9单字母: H2N-DAla-STTTNYT-NH2三字母: H2N-DAl…

设计模式 — 抽象工厂模式

抽象工厂模式女娲的失误实例 一实例 二抽象工厂模式的应用抽象工厂模式的优点抽象工厂模式的缺点抽象工厂模式的使用场景抽象工厂模式的注意事项女娲的失误 女娲造人的故事。人是造出来了,世界也热闹了,可是低头一看,都是清一色的类型&#…

Spark框架概述

Spark 框架概述 1.1. Spark是什么 定义:Apache Spark是用于大规模数据处理的统一分析引擎。 弹性分布式数据集RDD是一种分布式内存抽象,其使得程序员能够在大规模集群中做内存运算,并且有一定的容错方式。而这也是整个Spark的核心数据结构…

体验静态代码块

定义 public class Game {// 静态代码块static {System.out.println("static...run...");}// 构造方法public Game() {System.out.println("game...construct...");} }使用 结论 静态代码块在类被首次加载的时候触发启动

效能优化实践:C/C++单元测试万能插桩工具

研发效能是一个涉及面很广的话题,它涵盖了软件交付的整个生命周期,涉及产品、架构、开发、测试、运维,每个环节都可能影响顺畅、高质量地持续有效交付。在腾讯安全平台部实际研发与测试工作中我们发现,代码插桩隔离是单元测试工作…

theos tweak导入自定义类

有时,我们使用tweak的时候需要用到自定义的类,那么怎么引用呢? 假设我们有一个自定义类,people.h/people.m 那么分两种情况: 情况一,直接使用官方的tweak工程: 目录结构一般如下: …

[第九篇]——Docker 镜像使用

Docker 镜像使用 当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。 下面我们来学习: 1、管理和使用本地 Docker 主机镜像2、创建镜像列出镜像列表 …

蛋白纯化-实验设计

小 M 不怕纯化“难”,IP、WB 只等闲。泡了两年实验室的小 M,理论与实操经验共有,且看我如何闯过蛋白纯化的几道“关”。 第一关 产品选择 小 M 敲黑板:此关最基础也最重要,谨防“一步错,步步错”。 亲和层析…

jenkins+junit4+allure+selenium实现自动化测试与结果可视化

安装包 jenkins.war jdk-8u332-linux-x64.tar.gz https://repo1.maven.org/maven2/io/qameta/allure/allure-commandline/2.17.2/ allure-commandline-2.17.2.zip https://chromedriver.storage.googleapis.com/index.html chromedriver 安装JDK 解压 tar xvf…

优盘数据恢复如何操作?恢复U盘数据的三个简单方法

对于我们用户来说,经常使用U盘来存储一些重要的文件是很常见的事。很多用户在使用的时候,经常因为操作不规范,而造成一些数据丢失。那么我们该如何做呢?优盘数据恢复如何操作?今天小编就来为大家分享一下关于如何将U盘…

基于梯度的图像边缘检测

参考视频:https://www.bing.com/videos/search?qacomputationalapproachtoedgedetection&docid608014236869751913&mid8C04384FFDD6A47533238C04384FFDD6A4753323&viewdetail&FORMVIRE 参考文献:A Computational Approach to Edge Dete…

【图像去噪】基于空间光谱总变化减少高光谱图像的混合噪声(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

线程的“打断”

【打断线程的三个方法】: //Thread.java public void interrupt() //t.interrupt() 打断t线程(设置t线程某给标志位ftrue,并不是打断线程的运行) public boolean isInterrupted() //t.isInterrupted() 查询打…