李锋镝的博客

  • 首页
  • 时间轴
  • 说说
  • 读书观影
  • 系列
  • AI工具集
  • 论坛
  • 友圈
    • 友链
    • 朋友圈
    • 游客中心
  • 留言
    • 留言
    • 走心评论
  • 关于
    • 关于本站
    • Now
    • 每日心情
    • 网站地图
    • 网站统计
    • 赞助
  • 星球穿梭
  • 🚇开往
静亦定 动亦定
惟坚韧者始能遂其志
  1. 首页
  2. 转载
  3. 技术
  4. 正文

彻底搞懂mysql日志系统binlog,redolog,undolog

2021年5月19日 313 1 4
本文最后更新于 2021年5月19日,距今已 2001 天,其中的信息可能已经发生变化,请注意甄别。

本文主要总结下重做日志(redo log)、回滚日志(undo log)、二进制日志(binlog)的概念。

  • redo log 是物理日志,undo log 和 binlog 是逻辑日志
  • binlog二进制日志是server层的无论MySQL用什么引擎,都会有的,主要是左主从复制,时间点恢复使用
  • redo log重做日志是InnoDB存储引擎层的,用来保证事务安全
  • undo log回滚日志保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC),也即非锁定读

crash-safe概念

InnoDB 就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为 crash-safe。

举个列子:当我们修改的时候,写完内存了(buffer),但数据还没真正写到磁盘的时候。此时我们的数据库挂了,我们可以对数据进行恢复

redo log (重做日志)

redo log 是物理日志,记载着每次在某个页上做了什么修改。写redo log也是需要写磁盘的,但它的好处就是顺序IO(我们都知道顺序IO比随机IO快非常多)。写入的速度很快

生命周期

  1. 事务开始之后,就开始产生 redo log 日志了,在事务执行的过程中,redo log 开始逐步落盘
  2. 当对应事务的脏页写入到磁盘之后,redo log 的使命就完成了,它所占用的空间也就可以被覆盖了。
  3. InnoDB 的 redo log 是固定大小的,比如可以配置为一组 4 个文件,每个文件的大小是 1GB。从头开始写,写到末尾就又回到开头循环写

彻底搞懂mysql日志系统binlog,redolog,undolog

  1. write pos 是当前记录的位置,一边写一边后移,写到第 3 号文件末尾后就回到 0 号文件开头。checkpoint 是当前要擦除的位置,也是往后推移并且循环的,擦除记录前要把记录更新到数据文件。
  2. write pos 和 checkpoint 之间的的部分,可以用来记录新的操作。如果 write pos 追上 checkpoint,表示“粉板”满了,这时候不能再执行新的更新,得停下来先擦掉一些记录,把 checkpoint 推进一下。

存储内容

redo log 包括两部分:

  • 一是内存中的日志缓冲(redo log buffer),该部分日志是易失性的;
  • 二是磁盘上的重做日志文件(redo log file),该部分日志是持久的,redo log 存储的是物理格式的日志,记录的是物理数据页面的修改信息,它是顺序写入 redo log file 中的。

落盘方式(将 innodb 日志缓冲区的日志刷新到磁盘)

  1. Master Thread 每秒一次执行刷新 Innodb_log_buffer 到重做日志文件
  2. 每个事务提交时会将重做日志刷新到重做日志文件
  3. 当重做日志缓存可用空间少于一半时,重做日志缓存被刷新到重做日志文件

注意:

  1. 其实写redo log的时候,也会有buffer,是先写buffer,再真正落到磁盘中的。至于从buffer什么时候落磁盘,会有配置供我们配置。
  2. redo log 是 InnoDB 引擎特有的日志
  3. 持久性就是靠redo log来实现的(如果写入内存成功,但数据还没真正刷到磁盘,如果此时的数据库挂了,我们可以靠redo log来恢复内存的数据,这就实现了持久性)。

undo log (回滚日志)

undo log保存了事务发生之前的数据的一个版本,作用:

  1. 可以用于回滚
  2. 同时可以提供多版本并发控制下的读(MVCC),也即非锁定读

    生命周期

  3. 事务开始之前,将当前事务版本生成 undo log,undo log 也会产生 redo log 来保证 undo log 的可靠性。
  4. 当事务提交之后,undo log 并不能立马被删除,而是放入待清理的链表,
  5. 由 purge 线程判断是否有其它事务在使用 undo 段中表的上一个事务之前的版本信息,从而决定是否可以清理 undo log 的日志空间。

存储内容

undo log 存储的是逻辑格式的日志,保存了事务发生之前的上一个版本的数据,可以用于回滚。当一个旧的事务需要读取数据时,为了能读取到老版本的数据,需要顺着 undo 链找到满足其可见性的记录。

存储位置

默认情况下,undo 文件是保存在共享表空间的,也即 ibdatafile 文件中,当数据库中发生一些大的事务性操作的时候,要生成大量的 undo log 信息,这些信息全部保存在共享表空间中,因此共享表空间可能会变得很大,默认情况下,也就是 undo log 使用共享表空间的时候,被“撑大”的共享表空间是不会、也不能自动收缩的。因此,MySQL5.7 之后的“独立 undo 表空间”的配置就显得很有必要了。

binlog (二进制日志)

  • binlog我们可以简单理解为:存储着每条变更的SQL语句
  • 可以通过binlog来对数据进行恢复
  • binlog 可以用于主从复制中,从库利用主库上的 binlog 进行重播,实现主从同步。用于数据库的基于时间点、位点等的还原操作。binlog 的模式分三种:Statement、Row、Mixed。

bin-log三种模式

Statement 模式

每一条修改数据的 sql 都会记录到 master 的 binlog 中,slave 在复制的时候,sql 进程会解析成和原来在 master 端执行时的相同的 sql 再执行。

  • 优点:在 statement 模式下首先就是解决了 row 模式的缺点,不需要记录每一行数据的变化,从而减少了 binlog 的日志量,节省了 I/O 以及存储资源,提高性能。因为它只需要记录在 master 上执行的语句的细节以及执行语句的上下文信息。
  • 缺点:在 statement 模式下,由于它是记录的执行语句,所以,为了让这些语句在 slave 端也能正确执行,那么它还必须记录每条语句在执行的时候的一些相关信息,即上下文信息,以保证所有语句在 slave 端和在 master 端执行结果相同。另外就是,由于 MySQL 现在发展比较快,很多新功能不断的加入,使 MySQL 的复制遇到了不小的挑战,自然复制的时候涉及到越复杂的内容,bug 也就越容易出现。在statement 中,目前已经发现不少情况会造成 MySQL 的复制出现问题,主要是在修改数据的时候使用了某些特定的函数或者功能才会出现,比如:sleep() 函数在有些版本中就不能被正确复制,在存储过程中使用了 last_insert_id() 函数,可能会使 slave 和 master 上得到不一致的 id 等等。由于 row 模式是基于每一行来记录变化的,所以不会出现类似的问题。
Row 模式

日志中会记录每一行数据被修改的形式,然后在 slave 端再对相同的数据进行修改。row 模式只记录要修改的数据,只有 value,不会有 sql 多表关联的情况。

  • 优点:在 row 模式下,binlog 中可以不记录执行的 sql 语句的上下文相关的信息,仅仅只需要记录哪一条记录被修改了,修改成什么样了,所以 row 的日志内容会非常清楚的记录下每一行数据的修改细节,非常容易理解。而且不会出现某些特定情况下的存储过程和 function,以及 trigger 的调用和触发无法被正确复制问题。
  • 缺点:在 row 模式下,当所有执行语句记录到日志中的时候,都将以每行记录的修改来记录,这样可能会产生大量的日志内容。
Mixed 模式

从官方文档中看到,之前的 MySQL 一直都只有基于 statement 的复制模式,直到 5.1.5 版本的 MySQL 才开始支持 row 复制。从 5.0 开始,MySQL 的复制已经解决了大量老版本中出现的无法正确复制的问题。但是由于存储过程的出现,给 MySQL Replication 又带来了更大的新挑战。另外,看到官方文档说,从 5.1.8 版本开始,MySQL 提供了除 Statement 和 Row 之外的第三种复制模式:Mixed,实际上就是前两种模式的结合。在 Mixed 模式下,MySQL 会根据执行的每一条具体的 SQL 语句来区分对待记录的日志形式,也就是在 statement 和 row 之间选择一种。新版本中的 statment 还是和以前一样,仅仅记录执行的语句。而新版本的 MySQL 也对 row 模式做了优化,并不是所有的修改都会以 row 模式来记录,比如遇到表结构变更的时候就会以 statement 模式来记录,如果 SQL 语句确实就是 update 或者 delete 等修改数据的语句,那么还是会记录所有行的变更。

生命周期

事务提交的时候,一次性将事务中的 sql 语句(一个事务可能对应多个 sql 语句)按照一定的格式记录到 binlog 中,这里与 redo log 很明显的差异就是 redo log 并不一定是在事务提交的时候才刷新到磁盘,而是在事务开始之后就开始逐步写入磁盘。binlog 的默认保存时间是由参数 expire_logs_days 配置的,对于非活动的日志文件,在生成时间超过 expire_logs_days 配置的天数之后,会被自动删除。

binlog和redo log 写入的细节 - 两阶段提交

MySQL通过两阶段提交来保证redo log和binlog的数据是一致的

update T set c=c+1 where ID=2;

这里我给出这个 update 语句的执行流程图,图中浅色框表示是在 InnoDB 内部执行的,深色框表示是在执行器中执行的

彻底搞懂mysql日志系统binlog,redolog,undolog

将 redo log 的写入拆成了两个步骤:prepare 和 commit,这就是"两阶段提交"。

附:

彻底搞懂mysql日志系统binlog,redolog,undolog

参考:

  1. https://www.cnblogs.com/f-ck-need-u/archive/2018/05/08/9010872.html#auto_id_1
  2. https://www.cnblogs.com/wy123/p/8365234.html

原文链接:http://xiaot123.com/mysqlbinlogredologundolog-lagwx

参考链接

3
  1. 1https://www.cnblogs.com/f-ck-need-u/archive/2018/05/08/9010872.html#auto_id_1www.cnblogs.com
  2. 2https://www.cnblogs.com/wy123/p/8365234.htmlwww.cnblogs.com
  3. 3http://xiaot123.com/mysqlbinlogredologundolog-lagwxxiaot123.com
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
分享到

彻底搞懂mysql日志系统binlog,redolog,undolog

也可使用浏览器菜单中的「分享」功能

微信扫一扫分享

标签: MySQL 数据库
最后更新:2021年5月19日

岁月同一天 11 月 11 日

回望过去的今天,你在写什么

  • AI
    1 年前 2025年11月11日
    深度解析 RAG 技术:从原理到落地,构建高精度检索增强生成系统

    在企业知识库问答、专业文档处理、智能客服等场景中,大语言模型(LLM)常常面临“答非所问”“信息过时”“泄露隐私”等问题…

  • AI
    1 年前 2025年11月11日
    深度实战:基于 LangGraph + MCP 的智能音乐推荐 Agent 全解析(从搭建到落地)

    在 AI 与推荐系统结合的浪潮中,传统音乐推荐往往局限于“基于协同过滤”或“关键词匹配”,无法理解用户自然语言中的模糊需…

  • AI
    1 年前 2025年11月11日
    MCP深度解析:从协议本质到实战落地,彻底搞懂 AI 工具交互的标准化方案

    在 AI 工具化的浪潮中,Function Call 让 LLM 具备了调用外部工具的能力,但随着工具数量增多、LLM …

  • 5 年前 2021年11月11日
    WordPress的自动更新好烦啊

    昨晚突然收到邮件,说是WordPress自动更新到最新版了,好烦啊…… 每次更新完之后就得改一大堆东西,太坑了,今天终于…

  • 7 年前 2019年11月11日
    分布式锁-Zookeeper实现分布式锁

    如何用Zookeeper实现分布式锁? 在学习分布式锁之前,需要首先了解一下Zookeeper的[临时顺序节点]。 什么…

  • 7 年前 2019年11月11日
    再小的应用也有架构,面向架构新手的架构实践!

    文章主人公:小明,就职于某互联网公司,从事后端开发工作。最近小明收到通知公司需要开发一款《证件照》应用,需要征集架构方案…

  • 7 年前 2019年11月11日
    分布式锁-Java常用技术方案

    前言:       由于在平时的工作中,线上服务器是分布式多台部署的,经常会面临解决分布式场景下数据一致性的问题,那么就…

  • 7 年前 2019年11月11日
    在微服务中使用领域事件

    稍微回想一下计算机硬件的工作原理我们便不难发现,整个计算机的工作过程其实就是一个对事件的处理过程。当你点击鼠标、敲击键盘…

相关文章
  • AI原生数据库新标杆:seekdb深度解析,轻量架构与混合搜索的双重革命2025年12月17日
  • MySQL清理二进制文件2025年3月5日
  • 在 SQL 中做范围查询时,使用 BETWEEN AND 和直接用 >/</>=/<= 这类比较运算符,哪一个的性能更优。2026年1月15日
  • MySQL数据库详解——执行SQL查询语句时,其底层到底经历了什么?2019年12月22日
  • 使用AbstractRoutingDataSource动态切换数据源2025年3月15日

李锋镝

既然选择了远方,便只顾风雨兼程。

打赏 点赞
< 上一篇
下一篇 >
1234567891112131415161718192021222324252627282930313233343536373839404142434446474849505152535455575859606162636465666769727476777879808182858687909293949596979899
取消回复
…

文章评论

  • 林羽凡Lv 4友

    你这个详细呀,我现在看这些资料,基本就看个大概,出了问题才详细看,已经没有耐心一点一点的看了。 :heixian:

    WindowsWindowsChrome 90.0.4430.85Chrome 90.0.4430.85中国中国-甘肃-兰州
    2021年5月19日
    00 回复
    • 李锋镝博主

      @林羽凡 看见别人写的好,就不要脸的转过来了,哈哈 :douyin.74:

      WindowsWindowsChrome 90.0.4430.72Chrome 90.0.4430.72中国中国-北京
      2021年5月19日
      00 回复
      • 林羽凡Lv 4友

        @李锋镝 你这个太专业了,哈哈~~~我这种小白基本是看不懂的。

        WindowsWindowsChrome 90.0.4430.85Chrome 90.0.4430.85中国中国-甘肃-兰州
        2021年5月20日
        00 回复
        • 李锋镝Lv 5

          @林羽凡 :douyin.cot: 这么晚还在撸代码吗??

          WindowsWindowsChrome 89.0.4389.90Chrome 89.0.4389.90中国中国-北京
          2021年5月20日
          00 回复
  • 爆竹声中一岁除,春风送暖入屠苏。
    千门万户曈曈日,总把新桃换旧符。

    听点儿音乐吧 朋友~
    文章目录
    最新 热点 随机
    最新 热点 随机
    给服务器加了WAF 又一个逆天改命的人:小小徐 AI的生成能力等于生产力吗? NGINX严重漏洞(CVE-2026-15176、CVE-2026-93479、CVE-2026-97205) Kratos-plus v1.1.27更新说明 php2shell远程执行漏洞修复(CVE-2026-109618 和 CVE-2026-109619)
    给主题增加了游客中心功能心气没了,干什么都不得劲给服务器加了WAF我觉得是时候公布我的导航网站了游本昌去世关于主题加载速度优化的一点儿小演进
    吐槽下Google浏览器~ 出院了~~~ 在 SQL 中做范围查询时,使用 BETWEEN AND 和直接用 >/=/ 深度拆解 MemGen:Agent 生成式隐式记忆框架的原理、源码与实战 Java中ArrayList为什么比LinkedList查询速度快? Elasticsearch常用查询
    最近评论
    李锋镝 发布于 2 天前(11月09日) 我也刷到了,说是恶意引流的
    皮皮社长 发布于 2 天前(11月09日) 我刷到的,怎么是说剧本骗流量的?如果真的是用来骗流量,那真恶心。欺骗网友感情。
    李锋镝 发布于 2 天前(11月09日) 现在我这个是十个,其实也够用了
    老张博客 发布于 2 天前(11月09日) 雷池唯一不好的就是只能免费5个网站。
    fairy 发布于 4 天前(11月06日) 机器人快来我这里吧!
    标签聚合
    Claude JVM Redis MySQL 分布式 K8s IDEA ElasticSearch Theme 数据库 AI编程 AI 多线程 SQL WordPress 架构 SpringBoot JAVA 日常 Spring
    友情链接
    • 皮皮社
    • 知向前端
    • 懋和道人
    • 志文工作室
    • 韩情脉脉
    • sssr7844的博客
    • Mr.Sun的博客
    • lijie blog
    • 瓦匠个人小站
    • 彬红茶日记
    • 韩小韩博客
    • Serendipity
    • 哥斯拉
    • Honesty
    • 刘永博客
    • 老张博客
    • 搬砖日记
    • 九仞之行
    • 林羽凡

    COPYRIGHT © 2016-2026 lifengdi.com. ALL RIGHTS RESERVED.

    lifengdi.com 十年之约虫洞

    Domain age badge for lifengdi.com

    Theme Kratos-plus By Dylan Li

    津ICP备2024022503号-3

    京公网安备11011502039375号