MYSQL--binlog和redo log
前言
MySQL日志
MySQL
日志主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。其中比较重要的就是二进制日志binlog
(归档日志)、事务日志redo log
(重做日志)和undo log
(回滚日志)。这篇文章主要来讲解
binlog和redo log
redo log
一、定义
- 定义:Redo Log是InnoDB存储引擎特有的日志,用于记录数据页的物理变化,即数据在磁盘上的修改。
- 作用:
- 保证事务的持久性:在数据库崩溃或意外关闭时,通过Redo Log可以恢复未提交的事务,确保数据的一致性。
- 提高写性能:采用WAL(Write-Ahead Logging)技术,即先写日志,再写磁盘,减少了磁盘I/O操作的次数和延迟。
二、记录内容
Redo Log:记录的是数据页的物理变化,即数据在磁盘上的实际修改。它包含了事务在数据页上的修改细节,但不包含具体的SQL语句。
三、存储方式
- Redo Log:
- 以循环方式记录,日志文件达到一定大小后会循环覆盖旧的日志。
- 日志文件以文件组的形式出现,包含多个日志文件,采用环形数组形式进行循环写入。
四、生命周期
- Redo Log:
- 生命周期较短,主要用于在短期内确保数据的持久性和一致性。
- 事务提交后的数据会最终被写入数据文件,而Redo Log会被清理和循环使用。
五、应用场景
- Redo Log:
- 主要用于数据库的崩溃恢复,确保事务的持久性和一致性。
Binlog
一、定义
- 定义:Binlog是MySQL数据库的二进制日志,记录了所有对数据库造成修改的SQL语句,如INSERT、UPDATE、DELETE等。
- 作用:
- 数据复制和同步:主要用于主从复制(replication),使得从库可以通过重放Binlog来跟上主库的变化。
- 数据恢复:在数据丢失时,通过Binlog可以将数据库恢复到某个时间点。
二、记录内容
- Binlog:记录的是逻辑变化,即SQL语句本身。它记录了所有对数据库造成修改的SQL语句,以及这些语句的执行时间等信息。
三、存储方式
- Binlog:
- 以二进制格式记录,使得其体积较小,并且可以高效地重放。
- Binlog文件会根据配置进行轮转,生成多个日志文件,以便于管理和恢复。
四、生命周期
- Binlog:
- 通常会在一定时间后被删除,具体时间依据数据库配置而定。
- 在数据恢复或主从复制过程中,Binlog会被重放以恢复数据或同步数据。
五、应用场景
- Binlog:
- 主要用于数据复制和同步,以及数据恢复(如恢复到某个特定时间点)。
具体应用讲解
以上就是一条查询 sql 的执行流程,那么接下来我们看看一条更新语句如何执行的呢?sql 语句如下:
update tb_student A set A.age='19' where A.name=' 张三 ';
给张三修改下年龄。其实条语句也基本上会沿着上一个查询的流程走,只不过执行更新的时候肯定要记录日志啦,这就会引入日志模块了,MySQL 自带的日志模块式 binlog(归档日志) ,所有的存储引擎都可以使用,我们常用的 InnoDB 引擎还自带了一个日志模块 redo log(重做日志),我们就以 InnoDB 模式下来探讨这个语句的执行流程。流程如下:
先查询到张三这一条数据,如果有缓存,也是会用到缓存。
然后拿到查询的语句,把 age 改为 19,然后调用引擎 API 接口,写入这一行数据,InnoDB 引擎把数据保存在内存中,同时记录 redo log,此时 redo log 进入 prepare 状态,然后告诉执行器,执行完成了,随时可以提交。
执行器收到通知后记录 binlog,然后调用引擎接口,提交 redo log 为提交状态。
更新完成。
为什么要用两个日志呢?
这是因为最开始 MySQL 并没与 InnoDB 引擎( InnoDB 引擎是其他公司以插件形式插入 MySQL 的) ,MySQL 自带的引擎是 MyISAM,但是我们知道 redo log 是 InnoDB 引擎特有的,其他存储引擎都没有。
这就导致会没有 crash-safe 的能力(crash-safe 的能力即使数据库发生异常重启,之前提交的记录都不会丢失),binlog 日志只能用来归档。
并不是说只用一个日志模块不可以,只是 InnoDB 引擎就是通过 redo log 来支持事务的。
那redo log和binlog谁先写呢?
先写 redo log 直接提交,然后写 binlog,假设写完 redo log 后,机器挂了,binlog 日志没有被写入,那么机器重启后,这台机器会通过 redo log 恢复数据,但是这个时候 binlog 并没有记录该数据,后续进行机器备份的时候,就会丢失这一条数据,同时主从同步也会丢失这一条数据。
先写 binlog,然后写 redo log,假设写完了 binlog,机器异常重启了,由于没有 redo log,本机是无法恢复这一条记录的,但是 binlog 又有记录,那么和上面同样的道理,就会产生数据不一致的情况。
通过解释可以看到不管谁先写都会产生问题,那么是怎么解决的呢?
简单来说我们通常是先写redo log,等写完binglog 后,再提交redo log,数据不一致的问题下面有详细解释
怎么解决先redo log的数据不一致的问题?
先写redo log解决不一致问题是引入prepare 预提交状态
Redo Log的提交过程可以概括为两个阶段:Prepare阶段和Commit阶段。
Prepare阶段:
- 在这个阶段,事务开始后,InnoDB会将修改的数据页的变化信息写入到redo log buffer中。
- 同时,会将事务的XID(内部XA事务的ID)写入到redo log中,并将redo log对应的事务状态设置为prepare。
- 根据配置(如
innodb_flush_log_at_trx_commit
的值),可能在这个阶段就将redo log buffer中的内容刷新到磁盘上的redo log文件中,以确保数据的持久性。Commit阶段:
- 当事务提交时,MySQL的执行器会处理binlog,将事务的修改以SQL语句的形式写入到binlog中。
- Binlog写入成功后,InnoDB会调用引擎的提交事务接口,将redo log的状态从prepare更改为commit。
- 这一步并不需要将redo log的状态立即刷新到磁盘上,因为只要binlog写磁盘成功,就算redo log的状态还是prepare也没有关系,因为redo log中的信息已经足够用于恢复数据。
- 但是,如果配置了
innodb_flush_log_at_trx_commit=1
,那么在事务提交时,InnoDB还是会将redo log buffer中的内容刷新到磁盘上,以确保数据的持久性。如果采用 redo log 两阶段提交的方式就不一样了,写完 binglog 后,然后再提交 redo log 就会防止出现上述的问题,从而保证了数据的一致性。
那么问题来了,有没有一个极端的情况呢?假设 redo log 处于预提交状态,binglog 也已经写完了,这个时候发生了异常重启会怎么样呢?
这个就要依赖于 MySQL 的处理机制了,MySQL 的处理过程如下:
判断 redo log 是否完整,如果判断是完整的,就立即提交。
如果 redo log 只是预提交但不是 commit 状态,这个时候就会去判断 binlog 是否完整,如果完整就提交 redo log, 不完整就回滚事务。
这样就解决了数据一致性的问题。
相关文章:
MYSQL--binlog和redo log
前言 MySQL日志 MySQL日志主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。其中比较重要的就是二进制日志binlog(归档日志)、事务日志redo log(重做日志)和undo log(回滚日志)。 这篇…...

R语言医疗数据分析笔记
分组因子又是什么意思,分组因子和数组的区别是什么 举个实际的例子 分组因子 分组因子是分类变量,用于将数据分成不同组以便于比较或分析。例如,在一项研究中,研究对象的性别(男性和女性)可以视为一个分组…...
SpringBoot使用Jackson-XML裁剪多余的根节点
相关博客:《SpringBoot集成WebService(wsdl)》 比如我们有以下入参 我们只需要MedicalCardInfo这个根节点,其余都不要。如何处理? <A><B><Sender>Aa</Sender><MsgType>Bb</MsgType><MsgVersion>…...

vue路由学习
1、基本了解 (1) (2) (3)在创建vue项目时,就已经勾选了vue-router 2、 (0)自己手写了一个新的组件文件(部门管理)(DeptView.vue) (1&a…...
Kubernetes基于helm部署Kafka_Kraft集群并取消SASL认证且开启数据持久化
注:本文档部署Kafka时,取消了默认的SASL认证的相关配置,并开启了数据持久化。 一、添加并更新Helm仓库 helm repo add bitnami https://charts.bitnami.com/bitnami helm repo update bitnami二、下载并解压kafka的Chart helm pull bitna…...
kotlin -- Flow和Rxjava 对比
引言 我们先说说,关键词 响应式编程,数据流,观察者模式。 观察者模式 一个button setOnClickListener 就是观察者模式。 button是被观察者,它产生一个事件(点击),观察者OnClickListener接收到,做出相…...

【JVM篇】自动内存管理——HotSpot虚拟机对象探秘
目录 前言 一、对象的创建 二、对象的内存布局 三、对象的访问定位 总结 前言 相关文章:【JVM篇】自动内存管理——运行时数据区-CSDN博客 介绍完Java虚拟机的运行时数据区域之后,我们大致明白了Java虚拟机内存模型的概况,但可能会好奇其…...
代谢组数据分析(十七):基于structToolbox代谢组分析流程讲解
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 介绍 structToolbox 是一个广泛使用的工具箱,专门用于代谢组学和其他组学数据的分析。它提供了一系列的数据预处理、统计分析和机器学习方法,特别强调统计和机器学习的重要性。这个工具箱允许…...

科普课堂走起 | 什么是网络安全和数据安全?
网络安全和数据安全是现代数字世界中非常重要的两个概念。让我们来详细了解一下这两个领域。 1.网络安全(Network Security) 网络安全是指保护网络系统免受未经授权的访问、攻击、破坏或滥用的一系列技术和过程。它旨在确保信息的机密性、完整性和可用…...
C语言中常用的函数
处理字符串常用的函数 size_t strspn(const char *s, const char *accept); 函数参数说明: s是被查找的字符串 accepct是要匹配的字符串函数功能说明: 它返回s字符串起始部分中,完全由accept字符串中的字符组成的子字符串的长度函数返回值…...
如何在SpringBoot中进行单元测试?
在Spring Boot中进行单元测试通常会涉及以下几个步骤: 1. 添加测试依赖 确保在你的pom.xml(Maven)或build.gradle(Gradle)中包含了Spring Boot的测试依赖。Spring Boot的Starter依赖spring-boot-starter-test通常已经…...

分布式事务学习整理
一、整体背景 最近在分布式事务领域这块的了解比较少,对自己来说是一个业务盲点,所以想抽空学习以及整理下关于分布式事务的相关知识。 1、分布式事务的发展 总所周知,我们为什么要考虑分布式事务,从一开始发展来说,…...
Conda配置瘦身术:精通conda config --remove命令
Conda配置瘦身术:精通conda config --remove命令 Conda作为Python和其他科学计算语言的包管理器,其灵活性和强大功能在很大程度上依赖于其配置系统。随着时间的推移,Conda配置可能会变得复杂和冗余。conda config --remove命令提供了一种方法…...

Windows下编译安装PETSc
本文记录在Windows下使用MinGW-w64编译安装PETSc的流程。 0、环境 操作系统Windows 11MSYS2msys2-x86_64-20240507 1、开发环境 首先,下载并安装MSYS2,然后编辑PATH环境变量,添加mingw64相关路径:C:\msys64\mingw64\bin。 然…...

phpstudy搭建sqlilabs本地靶场
请先在网上解决好前置条件的下载和安装:phpstudy、vscode、navicat premium(非必要)、sqlilab的压缩包/文件夹 phpstudy--安装sqlilabs 1.打开phpstudy后,我们会用到MySQL5.7.26和Nginx1.15.11 #mysql5.7.26是因为sqlilabs靶场不支持高版本MySQL 2.在软…...

Linux 实验基础环境准备(外网篇)
1.关闭禁用防火墙和selinux systemctl disable firewalld --now sed -i s/SELINUXenforcing/SELINUXdisabled/ /etc/selinux/config2.保证可以连接外网 ping -c3 www.baidu.com 3.配置yum为阿里仓库并下载epel源 mkdir /etc/yum.repos.d/bak/; mv /etc/yum.repos.d/*.repo /e…...
centos8 安装mysql 制作备份数据库脚本
1、配置阿里云源 cd /etc/yum.repos.d/ vim CentOS-Stream-AppStream.repo [appstream] nameCentOS Stream $releasever - AppStream #mirrorlisthttp://mirrorlist.centos.org/?release$stream&arch$basearch&repoAppStream&infra$infra baseurlhttp://mirrors…...

Parsing error: The keyword ‘interface‘ is reserved配置优化
当我们在创建Vue项目时,Vue默认是配置了eslint代码规范检查的,不过我们在项目中Typescript来编写代码时,却报了标题的错误,对应的代码如下: <script lang="ts"> export default{name: "DlHeader" } </script><script setup lang=&quo…...

C语言指针详解-包过系列(二)目录版
C语言指针详解-包过系列(二)目录版 1、数组名的深入理解1.1、数组名的本质1.2、数组名本质的两个例外1.2.1、sizeof(数组名)1.2.2、&数组名 2、使用指针访问数组3、一维数组传参本质4、二级指针4.1、二级指针介绍4.2、二级指针…...

驰骋BPM RunSQL_Init SQL注入漏洞复现
0x01 产品简介 驰骋BPM系统由济南驰骋信息技术有限公司研发,具有悠久的历史和丰富的行业经验。其工作流引擎CCFlow自2003年开始研发,是国内知名的老牌工作流引擎,在BPM领域拥有广泛的研究群体与应用客户群。统提供.net与java两个版本,且两个版本的代码结构、数据库结构、设…...
DDPM优化目标公式推导
DDPM优化目标公式推导 DDPM优化目标公式推导**1. 问题定义****2. 优化目标:最大化对数似然****3. 变分下界的分解****4. 关键步骤:简化 KL 散度项****(a) 后验分布 q ( x t − 1 ∣ x t , x 0 ) q(\mathbf{x}_{t-1} | \mathbf{x}_t, \mathbf{x}_0) q(xt…...
Playwright自动化测试全栈指南:从基础到企业级实践(2025终极版)
引言 在Web应用复杂度指数级增长的今天,传统自动化测试工具面临动态渲染适配难、多浏览器兼容差、测试稳定性低三大挑战。微软开源的Playwright凭借跨浏览器支持、自动等待机制和原生异步架构,成为新一代自动化测试的事实标…...

图上合成:用于大型语言模型持续预训练的知识合成数据生成
摘要 大型语言模型(LLM)已经取得了显著的成功,但仍然是数据效率低下,特别是当学习小型,专业语料库与有限的专有数据。现有的用于连续预训练的合成数据生成方法集中于文档内内容,而忽略了跨文档的知识关联&a…...
使用ORM Bee (ormbee) ,如何利用SQLAlchemy的模型生成数据库表.
使用ORM Bee (ormbee) ,如何利用SQLAlchemy的模型生成数据库表. 将原来SQLAlchemy的模型,修改依赖为: from bee.helper import SQLAlchemy 然后就可以开始生成了。很简单,主要是两个接口。 db.create_all(True) #创建所有模型的表…...
深圳SMT贴片工艺优化关键步骤
内容概要 深圳SMT贴片工艺优化作为现代电子制造的核心环节,聚焦于提升生产精度与稳定性。其技术框架围绕三大核心维度展开:温度动态调控、设备协同适配与工艺缺陷预判。通过精密温度曲线控制系统,实现回流焊环节的热能梯度精准匹配ÿ…...
Android 视图系统入门指南
1. View:界面的最小单位 本质:屏幕上的一个矩形区域,能显示内容或接收触摸。比喻:就像乐高积木,是组成界面的最小单位。常见子类: TextView(文字积木)、Button(按钮积木…...

c++学习-this指针
1.基本概念 非静态成员函数都会默认传递this指针(静态成员函数属于类本身,不属于某个实例对象),方便访问对象对类成员变量和 成员函数。 2.基本使用 编译器实际处理类成员函数,this是第一个隐藏的参数,类…...
c#bitconverter操作,不同变量类型转byte数组
缘起:串口数据传输的基础是byte数组,write(buff,0,num)或者writeline(string),如果是字符串传输就是string变量就可以了,但是在modbus这类hex传递时,就要遇到转换了,拼凑byte数组时需要各种变量的值传递,解…...

Houdini POP入门学习05 - 物理属性
接下来随着教程学习碰撞部分,当粒子较为复杂或者下载了一些粒子模板进行修改时,会遇到一些较奇怪问题,如粒子穿透等,这些问题实际上可以通过调节参数解决。 hip资源文件:https://download.csdn.net/download/grayrail…...
东芝Toshiba e-STUDIO2110AC打印机信息
基本信息 产品类型:数码复合机颜色类型:彩色涵盖功能:复印、打印、扫描接口类型:标配为 Ethernet(RJ45)10/100/1000BASE - T、USB2.0 高速;选配为 Wireless Lan、IEEE802.11b/g/n、blueteeth。中…...