当前位置: 首页 > 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.一级子模块和二级子模块的映射关…...

从Gen3到Gen5:PCIe均衡机制演进与实战配置避坑指南

从Gen3到Gen5&#xff1a;PCIe均衡技术深度解析与实战配置指南 PCIe&#xff08;Peripheral Component Interconnect Express&#xff09;作为现代计算系统中不可或缺的高速串行总线标准&#xff0c;其性能随着每一代技术的演进不断提升。从Gen3的8 GT/s到Gen5的32 GT/s&#x…...

《AI视觉检测:从入门到进阶》第一章(2)

前沿技术背景介绍&#xff1a;AI 智能体视觉系统&#xff08;TVA&#xff0c;Transformer-based Vision Agent&#xff09;&#xff0c;是依托Transformer架构与因式智能体所构建的新一代视觉检测技术。它区别于传统机器视觉与早期AI视觉&#xff0c;代表了工业智能化转型与视觉…...

基于大语言模型的AI智能体开发:从模块化架构到实践指南

1. 项目概述&#xff1a;从个人助手到开源协作的JARVIS如果你对AI和自动化感兴趣&#xff0c;最近在GitHub上逛&#xff0c;大概率会看到一个名字&#xff1a;Likhithsai2580/JARVIS。这可不是漫威电影里那个无所不能的钢铁侠AI管家&#xff0c;而是一个实实在在的开源项目。但…...

别再手动解析了!用C# WPF + NModbus4 + DataConvertLib搞定Modbus浮点数读写(附完整源码)

工业级Modbus浮点数读写实战&#xff1a;C# WPF与NModbus4的高效数据解析方案 工业自动化领域的数据采集从来不是简单的寄存器读写。当你的SCADA系统需要从PLC读取一个温度值&#xff08;32位浮点数&#xff09;或从流量计获取累计量&#xff08;64位长整型&#xff09;时&…...

Java的java.util.random测试使用

Java随机数生成实战&#xff1a;探索java.util.Random的奥秘在软件开发中&#xff0c;随机数生成是不可或缺的功能&#xff0c;无论是游戏开发、密码学还是模拟测试&#xff0c;都需要可靠的随机数支持。Java提供了强大的java.util.Random类&#xff0c;它不仅是生成随机数的利…...

【困难】邮局选址问题-Java:解法二

分享一个大牛的人工智能教程。零基础&#xff01;通俗易懂&#xff01;风趣幽默&#xff01;希望你也加入到人工智能的队伍中来&#xff01;请轻击人工智能教程大家好&#xff01;欢迎来到我的网站&#xff01; 人工智能被认为是一种拯救世界、终结世界的技术。毋庸置疑&#x…...

别只用来生成大头照了!解锁 GPT Image 2 Web Workflow 的最新设计实战玩法

AI 绘画圈的头把交椅又要换人了。OpenAI 刚刚发布了最新一代生图模型 GPT-Image-2。经过第一时间的上手实测&#xff0c;我们可以明显感受到&#xff0c;它在文本输出的准确性、以及对复杂现实世界知识的理解上&#xff0c;表现得比此前的 Nano Banana 2 更加出色。 一如既往&…...

python基本语法练习实例

1、打印九九乘法表1234567891011121314151617181920212223242526272829303132333435363738#只打印结果for i in range(1,10):for j in range(1,i1):print(i*j,end" ")print()#打印算数表达式for i in range(1,10):for j in range(1,i1):print("{0}*{1} {2:2}&q…...

怎样通过Navicat高效导出ER模型为PDF文档_大幅提升绘制效率

...

FLUX.1-dev效果实测:8K输出下4090D单卡耗时仅142秒,显存占用稳定23.7G

FLUX.1-dev效果实测&#xff1a;8K输出下4090D单卡耗时仅142秒&#xff0c;显存占用稳定23.7G 1. 开篇&#xff1a;重新定义图像生成的旗舰体验 当你第一次看到FLUX.1-dev生成的图像时&#xff0c;很难相信这是AI绘制的作品。那种影院级的光影质感、逼真的皮肤纹理、精准的光…...