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的作用
- 事务回滚:undo log由InnoDB存储引擎生成,用于实现事务的原子性。在事务执行“增删改”操作时,MySQL会隐式开启事务,undo log会记录更新前的数据。若事务执行中途MySQL崩溃,可利用undo log回滚到事务之前的数据状态。
- 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的作用
- 实现事务持久性:Buffer Pool基于内存,为防止断电导致数据丢失,InnoDB引擎在更新数据时,先更新内存(标记为脏页),再将修改以redo log形式记录,事务提交时只需将redo log持久化到磁盘,无需等待脏页写入磁盘。系统崩溃重启后,可依据redo log恢复数据,保证已提交记录不丢失,即crash - safe能力。
- 提升写入性能:写入redo log采用追加操作,是顺序写,而写入数据是随机写,磁盘顺序写比随机写高效得多,WAL技术将MySQL的写操作从随机写变为顺序写,提升了写入性能。
(二)redo log的缓存与刷盘时机
- 缓存:执行事务过程中,产生的redo log先写入redo log buffer,其默认大小16MB,可通过innodb_log_Buffer_size参数调整。
- 刷盘时机:
- 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的作用
- 数据备份与恢复:记录了所有数据库表结构变更和表数据修改的日志,不记录查询操作。当数据库数据丢失或损坏时,可利用binlog进行数据恢复。
- 主从复制:MySQL的主从复制依赖于binlog,主库将binlog传输到从库,从库通过回放binlog实现数据同步。
(二)binlog与redo log的区别
- 适用对象:binlog是MySQL的Server层实现的日志,所有存储引擎都可使用;redo log是InnoDB存储引擎实现的日志。
- 文件格式:binlog有STATEMENT(逻辑日志,记录SQL语句)、ROW(记录行数据最终修改结果)、MIXED(包含前两种模式)三种格式;redo log是物理日志,记录数据页的修改。
- 写入方式:binlog是追加写,写满创建新文件,保存全量日志;redo log是循环写,空间固定,保存未刷盘的脏页日志。
- 用途:binlog用于备份恢复、主从复制;redo log用于掉电等故障恢复。
(三)主从复制的实现与模型
- 实现过程:主库写binlog日志并提交事务,更新本地数据;从库I/O线程连接主库log dump线程接收binlog,写入relay log中继日志;从库回放线程读relay log,回放binlog更新数据,实现主从数据一致性。
- 复制模型:
- 同步复制:主库提交事务线程等待所有从库复制成功响应,性能差、可用性低。
- 异步复制(默认):主库提交事务线程不等待从库复制,主库宕机可能丢数据。
- 半同步复制: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采用两阶段提交。
(二)两阶段提交的过程
- prepare阶段:将XID(内部XA事务的ID)写入redo log,将事务状态设置为prepare,然后将redo log持久化到磁盘。
- commit阶段:把XID写入binlog,将binlog持久化到磁盘,接着调用引擎提交事务接口,将redo log状态设置为commit。
(三)异常重启的处理
在两阶段提交不同时刻MySQL异常重启,若redo log处于prepare状态,重启后会根据binlog中是否存在相同XID决定事务提交或回滚。若存在则提交,不存在则回滚,以此保证两份日志一致性。
(四)两阶段提交的问题与优化
- 问题:
- 磁盘I/O次数高:“双1”配置下,每个事务提交进行两次fsync,一次redo log刷盘,一次binlog刷盘。
- 锁竞争激烈:早期通过prepare_commit_mutex锁保证事务提交顺序,并发量大时锁争用严重,性能不佳。
- 优化 - 组提交:
- 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组写入。
相关文章:

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. 在模板中直接判断 如果只需要在模板中对属性值进行显示处理,…...

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 网络安全的内涵 随着计算机和网络技术的迅猛发展和广泛普及,越来越多的企业将经营的各种业务建立在Internet/Intranet环境中。于是,支持E-mail、文件共享、即时消息传送的消息和协作服务器成为当今商业社会中的极重要的IT基础设施。然而࿰…...
Linux 性能调优简单指南
一、性能调优概述 Linux 性能调优是系统运维的核心任务之一,目的是通过资源分配、参数优化和瓶颈消除,提升系统运行效率和稳定性。调优需遵循以下原则: 基于数据驱动:使用监控工具精准定位瓶颈分层逐级分析:从硬件到应用的逐层排查变更可回溯:单变量调整并记录结果场景适…...
第十一章: vue2-3 生命周期
创建 挂载 更新 销毁 四个阶段 > 生命周期函数 生命周期钩子 created mounted 创建vue2 的脚手架: vue create vue2_test v-show"isShow" v-if "isShow" 这里的isShow 表示一个函数 let isShow "true" <tem…...

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

输入搜索、分组展示选项、下拉选取,el-select 实现:即输入关键字检索,返回分组选项,选取跳转到相应内容页 —— VUE 项目-全局模糊检索
后端数据代码写于下一篇:输入搜索、分组展示选项、下拉选取,全局跳转页,el-select 实现 —— 后端数据处理代码,抛砖引玉展思路 【效果图】:分组展示选项 【去界面操作感受一下】—> 便捷简洁的企业官网 【录制效…...

Web入侵实战分析-常见web攻击类应急处置实验2
场景说明 某天运维人员,发现运维的公司站点被黑页,首页标题被篡改,你获得的信息如下: 操作系统:windows server 2008 R2业务:公司官网网站架构:通过phpstudy运行apache mysqlphp开放端口&…...
DeepSeek:AI商业化的新引擎与未来蓝图
摘要 在人工智能迅猛发展的浪潮中,DeepSeek以其卓越的技术实力和高超的商业化能力崭露头角。作为一款现象级AI产品,它不仅在算法性能上位居行业前列,还通过灵活的定制解决方案渗透到金融、医疗、零售等多个领域。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出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...

ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

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

10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...