当前位置: 首页 > news >正文

MySQL日志undo log、redo log和binlog详解

MySQL 日志:undo log、redo log、binlog 有什么用?

在这里插入图片描述

一、前言

在MySQL数据库中,undo log、redo log和binlog这三种日志扮演着至关重要的角色,它们各自承担着不同的功能,共同保障了数据库的正常运行和数据的完整性。了解它们的工作原理和作用,对于深入理解MySQL数据库的运行机制以及进行性能优化和故障排查都具有重要意义。

二、基础篇

MySQL的数据存储于磁盘,读写操作若频繁直接访问磁盘,效率较低。为提升性能,InnoDB存储引擎设计了缓冲池(Buffer Pool),以页(默认16KB)为单位缓存数据,包括索引页、数据页、Undo页等。

三、undo log

(一)undo log的作用

  1. 事务回滚:undo log由InnoDB存储引擎生成,用于实现事务的原子性。在事务执行“增删改”操作时,MySQL会隐式开启事务,undo log会记录更新前的数据。若事务执行中途MySQL崩溃,可利用undo log回滚到事务之前的数据状态。
  2. MVCC(多版本并发控制):对于“读提交”和“可重复读”隔离级别的事务,其快照读通过Read View + undo log实现。不同隔离级别创建Read View的时机不同,从而控制并发事务访问同一记录时的行为。

(二)undo log的记录方式

当InnoDB引擎对记录进行操作(修改、删除、新增)时,会把回滚所需信息记录到undo log中。如插入记录时记录主键值,删除记录时记录内容,更新记录时记录被更新列的旧值。不同操作产生的undo log格式不同,且每条记录的更新操作产生的undo log都有roll_pointer指针和trx_id事务id,可串成版本链。

(三)undo log的刷盘机制

undo log和数据页的刷盘策略一致,都需通过redo log保证持久化。buffer pool中有undo页,对undo页的修改会记录到redo log,redo log每秒刷盘,提交事务时也刷盘,以此保证undo log的持久化。

四、redo log

(一)redo log的作用

  1. 实现事务持久性:Buffer Pool基于内存,为防止断电导致数据丢失,InnoDB引擎在更新数据时,先更新内存(标记为脏页),再将修改以redo log形式记录,事务提交时只需将redo log持久化到磁盘,无需等待脏页写入磁盘。系统崩溃重启后,可依据redo log恢复数据,保证已提交记录不丢失,即crash - safe能力。
  2. 提升写入性能:写入redo log采用追加操作,是顺序写,而写入数据是随机写,磁盘顺序写比随机写高效得多,WAL技术将MySQL的写操作从随机写变为顺序写,提升了写入性能。

(二)redo log的缓存与刷盘时机

  1. 缓存:执行事务过程中,产生的redo log先写入redo log buffer,其默认大小16MB,可通过innodb_log_Buffer_size参数调整。
  2. 刷盘时机
    • MySQL正常关闭时;
    • 当redo log buffer中记录的写入量大于其内存空间一半时;
    • InnoDB的后台线程每隔1秒;
    • 每次事务提交时(由innodb_flush_log_at_trx_commit参数控制,默认值为1,取值0表示事务提交时redo log留在buffer中,取值2表示事务提交时redo log写入文件但不保证写入磁盘)。

(三)redo log文件组与循环写机制

默认InnoDB存储引擎有1个重做日志文件组,由2个redo log文件(ib_logfile0和ib_logfile1)组成,大小固定且一致。以循环写方式工作,write pos表示当前记录位置,checkpoint表示可擦除位置。当write pos追上checkpoint,即redo log文件满时,会暂停执行新更新操作,将脏页刷新到磁盘,擦除旧记录,移动checkpoint,然后恢复正常运行。

五、binlog

(一)binlog的作用

  1. 数据备份与恢复:记录了所有数据库表结构变更和表数据修改的日志,不记录查询操作。当数据库数据丢失或损坏时,可利用binlog进行数据恢复。
  2. 主从复制:MySQL的主从复制依赖于binlog,主库将binlog传输到从库,从库通过回放binlog实现数据同步。

(二)binlog与redo log的区别

  1. 适用对象:binlog是MySQL的Server层实现的日志,所有存储引擎都可使用;redo log是InnoDB存储引擎实现的日志。
  2. 文件格式:binlog有STATEMENT(逻辑日志,记录SQL语句)、ROW(记录行数据最终修改结果)、MIXED(包含前两种模式)三种格式;redo log是物理日志,记录数据页的修改。
  3. 写入方式:binlog是追加写,写满创建新文件,保存全量日志;redo log是循环写,空间固定,保存未刷盘的脏页日志。
  4. 用途:binlog用于备份恢复、主从复制;redo log用于掉电等故障恢复。

(三)主从复制的实现与模型

  1. 实现过程:主库写binlog日志并提交事务,更新本地数据;从库I/O线程连接主库log dump线程接收binlog,写入relay log中继日志;从库回放线程读relay log,回放binlog更新数据,实现主从数据一致性。
  2. 复制模型
    • 同步复制:主库提交事务线程等待所有从库复制成功响应,性能差、可用性低。
    • 异步复制(默认):主库提交事务线程不等待从库复制,主库宕机可能丢数据。
    • 半同步复制:MySQL 5.7版本新增,事务线程等待部分从库复制成功响应,兼顾性能和数据安全。

(四)binlog的刷盘时机

事务执行中,先将日志写入binlog cache,事务提交时,把binlog cache写入binlog文件。MySQL通过sync_binlog参数控制刷盘频率,取值0表示只write不fsync,交由操作系统决定持久化时机;取值1表示每次提交事务都write并fsync;取值N(N>1)表示累积N个事务后fsync。

六、两阶段提交

(一)两阶段提交的原因

事务提交时,redo log和binlog都要持久化到磁盘,若出现半成功状态,会导致两份日志逻辑不一致,在主从架构中造成数据不一致问题。为避免此问题,MySQL采用两阶段提交。

(二)两阶段提交的过程

  1. prepare阶段:将XID(内部XA事务的ID)写入redo log,将事务状态设置为prepare,然后将redo log持久化到磁盘。
  2. commit阶段:把XID写入binlog,将binlog持久化到磁盘,接着调用引擎提交事务接口,将redo log状态设置为commit。

(三)异常重启的处理

在两阶段提交不同时刻MySQL异常重启,若redo log处于prepare状态,重启后会根据binlog中是否存在相同XID决定事务提交或回滚。若存在则提交,不存在则回滚,以此保证两份日志一致性。

(四)两阶段提交的问题与优化

  1. 问题
    • 磁盘I/O次数高:“双1”配置下,每个事务提交进行两次fsync,一次redo log刷盘,一次binlog刷盘。
    • 锁竞争激烈:早期通过prepare_commit_mutex锁保证事务提交顺序,并发量大时锁争用严重,性能不佳。
  2. 优化 - 组提交
    • binlog组提交:将多个binlog刷盘操作合并,减少磁盘I/O次数。commit阶段拆分为flush(将binlog从cache写入文件)、sync(对binlog文件fsync,合并刷盘)、commit(各个事务按顺序做InnoDB commit操作)三个过程,每个阶段有队列和锁保护,第一个进入队列事务为leader,负责整队操作。
    • redo log组提交(MySQL 5.7):将prepare阶段融合在flush阶段,延迟redo log刷盘到flush阶段,sync阶段之前,实现redo log组写入。
前言
基础概念
undo log
作用事务回滚MVCC
记录方式
刷盘机制
redo log
作用事务持久提升写入
缓存与刷盘
文件组与循环写
binlog
作用备份恢复主从复制
与redo log区别
主从复制实现与模型
刷盘时机
两阶段提交
原因避免日志不一致
过程preparecommit
异常处理
问题与优化组提交
总结

相关文章:

MySQL日志undo log、redo log和binlog详解

MySQL 日志:undo log、redo log、binlog 有什么用? 一、前言 在MySQL数据库中,undo log、redo log和binlog这三种日志扮演着至关重要的角色,它们各自承担着不同的功能,共同保障了数据库的正常运行和数据的完整性。了解…...

C++中的指针

一.指针的定义 在C中,指针是一种特殊的变量,它存储另一个变量的内存地址。简单的说,指针是指向另一个数据类型的“指针”或“引用”,我们可以通过指针来间接操作其他变量的值。 指针的基本语法: 数据类型 *指针变量名 …...

拆解微软CEO纳德拉战略蓝图:AI、量子计算、游戏革命如何改写未来规则!

2025年2月19日 知名博主Dwarkesh Patel对话微软CEO萨蒂亚纳德拉 在最新访谈释放重磅信号:AI将掀起工业革命级增长,量子计算突破引爆材料科学革命,游戏引擎进化为世界模拟器。 整个视频梳理出几大核心观点,揭示科技巨头的未来十年…...

智能算法如何优化数字内容体验的个性化推荐效果

内容概要 在数字内容体验的优化过程中,个性化推荐系统的核心价值在于通过数据驱动的技术手段,将用户需求与内容资源进行高效匹配。系统首先基于用户行为轨迹分析,捕捉包括点击频次、停留时长、交互路径等关键指标,形成对用户兴趣…...

MATLAB在数据分析和绘图中的应用:从基础到实践

引言 股票数据分析是金融领域中的重要研究方向,通过对历史价格、成交量等数据的分析,可以帮助投资者更好地理解市场趋势和做出决策。MATLAB作为一种强大的科学计算工具,提供了丰富的数据处理和可视化功能,非常适合用于股票数据的…...

AI客服-接入deepseek大模型到微信(本地部署deepseek集成微信自动收发消息)

1.本地部署 1.1 ollama Ollama软件通过其高度优化的推理引擎和先进的内存管理机制,显著提升了大型语言模型在本地设备上的运行效率。其核心采用了量化技术(Quantization)以降低模型的计算复杂度和存储需求,同时结合张量并行计算&…...

Host文件没有配置ip解析,导致请求接口速度慢

Linux访问第三方接口速度慢 现象 在测试环境,Linux的服务器中,要访问第三方接口;速度有时快,有时慢。 有时候第一次访问比较慢,第二次访问比较快。第三方人员,排查之后,第三方接口没有问题&am…...

excel导入Mysql中时间格式异常

问题描述: 当使用xls/xlsx/csv导入mysql中,如果列是时间类型比如excel表中显示2024/02/20 09:18:00,导入后时间可能就会变成1900-01-01 09:18:00这样。 问题原因: 这是由于excel表中和数据库中的时间类型不匹配导致。 问题解决…...

vue 判断一个属性值,如果是null或者空字符串或者是空格没有值的情况下,赋值为--

在 Vue 中,可以通过多种方式来判断一个属性值是否为 null、空字符串或者仅包含空格,如果满足这些条件则将其赋值为 --。下面分别介绍在模板和计算属性、方法中实现的具体做法。 1. 在模板中直接判断 如果只需要在模板中对属性值进行显示处理&#xff0c…...

JavaWeb-Tomcat服务器

文章目录 Web服务器存在的意义关于Web服务器软件Tomcat服务器简介安装Tomcat服务器Tomcat服务器源文件解析配置Tomcat的环境变量启动Tomcat服务器一个最简单的webapp(不涉及Java) Web服务器存在的意义 我们之前介绍过Web服务器进行通信的原理, 但是我们当时忘记了一点, 服务器…...

vue语法---样式操作-行内样式

文章目录 直接写死的行内样式v-bind绑定对象(静态样式)对象数组 直接写死的行内样式 <template><div v-bind:style"{color:red}">睡觉</div> </template><script>export default{data() {return {}},methods:{}, mounted(){},} </…...

封装一个echarts的组件

父组件页面 <yyjlchartv-if"showyyjl"chartId"yyjllLine":sourceData"sourceDatayyjl":options"optionsyyjl"></yyjlchart>components: {LineEcharts,yyjlchart: () > import("../yyjlchart"),},data() {re…...

计算机网络安全之一:网络安全概述

1.1 网络安全的内涵 随着计算机和网络技术的迅猛发展和广泛普及&#xff0c;越来越多的企业将经营的各种业务建立在Internet/Intranet环境中。于是&#xff0c;支持E-mail、文件共享、即时消息传送的消息和协作服务器成为当今商业社会中的极重要的IT基础设施。然而&#xff0…...

Linux 性能调优简单指南

一、性能调优概述 Linux 性能调优是系统运维的核心任务之一,目的是通过资源分配、参数优化和瓶颈消除,提升系统运行效率和稳定性。调优需遵循以下原则: 基于数据驱动:使用监控工具精准定位瓶颈分层逐级分析:从硬件到应用的逐层排查变更可回溯:单变量调整并记录结果场景适…...

第十一章: vue2-3 生命周期

创建 挂载 更新 销毁 四个阶段 > 生命周期函数 生命周期钩子  created mounted 创建vue2 的脚手架&#xff1a; vue create vue2_test v-show"isShow" v-if "isShow" 这里的isShow 表示一个函数 let isShow "true" <tem…...

【算法基础】--前缀和

前缀和 一、一维前缀和示例模板[寻找数组的中心下标 ](https://leetcode.cn/problems/tvdfij/description/)除自身以外的数组乘积和可被k整除的子数组 一、一维前缀和 前缀和就是快速求出数组某一个连续区间内所有元素的和。 示例模板 已知一个数组arr&#xff0c;求前缀和 …...

输入搜索、分组展示选项、下拉选取,el-select 实现:即输入关键字检索,返回分组选项,选取跳转到相应内容页 —— VUE 项目-全局模糊检索

后端数据代码写于下一篇&#xff1a;输入搜索、分组展示选项、下拉选取&#xff0c;全局跳转页&#xff0c;el-select 实现 —— 后端数据处理代码&#xff0c;抛砖引玉展思路 【效果图】&#xff1a;分组展示选项 【去界面操作感受一下】—> 便捷简洁的企业官网 【录制效…...

Web入侵实战分析-常见web攻击类应急处置实验2

场景说明 某天运维人员&#xff0c;发现运维的公司站点被黑页&#xff0c;首页标题被篡改&#xff0c;你获得的信息如下&#xff1a; 操作系统&#xff1a;windows server 2008 R2业务&#xff1a;公司官网网站架构&#xff1a;通过phpstudy运行apache mysqlphp开放端口&…...

DeepSeek:AI商业化的新引擎与未来蓝图

摘要 在人工智能迅猛发展的浪潮中&#xff0c;DeepSeek以其卓越的技术实力和高超的商业化能力崭露头角。作为一款现象级AI产品&#xff0c;它不仅在算法性能上位居行业前列&#xff0c;还通过灵活的定制解决方案渗透到金融、医疗、零售等多个领域。DeepSeek以创新的商业模式和场…...

从零开始学习PX4源码9(部署px4源码到gitee)

目录 文章目录 目录摘要1.gitee上创建仓库1.1 gitee上创建仓库PX4代码仓库1.2 gitee上创建子仓库2.固件在gitee部署过程2.1下载固件到本地2.2切换本地分支2.3修改.gitmodules内容2.4同步子模块仓库地址2.5同步子模块仓库地址更新(下载)子模块3.一级子模块和二级子模块的映射关…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

MyBatis中关于缓存的理解

MyBatis缓存 MyBatis系统当中默认定义两级缓存&#xff1a;一级缓存、二级缓存 默认情况下&#xff0c;只有一级缓存开启&#xff08;sqlSession级别的缓存&#xff09;二级缓存需要手动开启配置&#xff0c;需要局域namespace级别的缓存 一级缓存&#xff08;本地缓存&#…...