简单聊聊MySQL的三大日志(Redo Log、Binlog和Undo Log)各有什么区别

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 在MySQL数据库管理中,理解Redo Log(重做日志)、Binlog(二进制日志)和Undo Log(回滚日志)至关重要。Redo Log确保数据持久性和崩溃恢复;Binlog用于主从复制和数据恢复,记录逻辑操作;Undo Log支持事务的原子性和隔离性,实现回滚与MVCC。三者协同工作,保障事务ACID特性。文章还详细解析了日志写入流程及可能的异常情况,帮助深入理解数据库日志机制。

在管理MySQL数据库时,了解和区分数据库使用的三大日志类型至关重要。这些日志对于确保数据的完整性、提供恢复机制以及维持数据库的稳定性发挥着关键作用。最主要还是小豆前段时间去参加面试被问到了这些内容,下面将详细讨论Redo Log、Binlog和Undo Log的异同。

Redo Log(重做日志)

  • 作用:Redo Log主要用于保证事务的持久性和数据库的崩溃恢复能力。当数据库发生崩溃时,InnoDB存储引擎可以使用Redo Log来恢复未提交事务的数据,确保数据的一致性。
  • 内容:在事务处理中产生的所有数据页的物理修改,比如数据页的变动。它包括内存中的Redo Log Buffer和磁盘上的Redo Log File。
  • 写入时机:在事务执行过程中,数据的更改首先被写入Redo Log Buffer,然后在事务提交时,这些更改会被写入到Redo Log File中。这个过程保证了MySQL可以在系统意外重启后,按照事务提交前的状态重新构建数据页,进而实现持久性。

Binlog(二进制日志)

  • 作用:Binlog主要用于数据复制(主从复制)和数据恢复。它记录了所有修改了数据库状态的SQL语句,比如实际执行的SQL语句。使得可以在主从复制环境中同步数据,或者在数据丢失后进行恢复。
  • 内容:Binlog记录了逻辑操作,如SQL语句。它以二进制的形式保存,并且可以是三种格式之一:Statement(记录SQL语句)、Row(记录行级更改)或Mixed(两者结合)。
  • 写入时机:在事务提交时,Binlog会记录本次修改的数据。Binlog的写入通常在Redo Log之后,以确保数据的一致性。

Undo Log(回滚日志)

  • 作用:Undo Log主要用于实现事务的原子性和隔离性。它记录了事务所做的更改,以便在事务失败或需要回滚时,可以恢复到事务开始之前的状态。
  • 内容:Undo Log记录了数据被修改前的样子,以及事务的回滚信息。它允许数据库在读取旧版本的数据时,能够提供一致的视图。
  • 写入时机:在数据被修改时,Undo Log会同时记录原始数据。在事务回滚或需要通过MVCC读取旧数据版本时,Undo Log会被使用。

日志之间的关系

Redo LogUndo Log是InnoDB存储引擎紧密关联的组成部分,其中Redo负责记录事务的前景操作,Undo负责记录事务的后景操作。而Binlog记录了执行修改的SQL语句,这三者协同工作保障了事务的ACID特性。Redo和Undo日志通常存在于存储引擎层面,而Binlog则是MySQL数据库级别的记录。

  • Redo Log是InnoDB特有的,专门记录物理更改,用于保证数据的持久性和崩溃恢复。
  • Binlog是MySQL服务器层面的,记录逻辑更改,用于主从复制和数据恢复,记录逻辑操作。
  • Undo Log也是InnoDB特有的,记录数据改变前的状态,用于事务的回滚和多版本并发控制(MVCC)。

日志写入流程

以一次事务执行为例,使用流程图画一下日志写入流程:

#bytemd-mermaid-1741849232844-0{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#bytemd-mermaid-1741849232844-0 .error-icon{fill:#552222;}#bytemd-mermaid-1741849232844-0 .error-text{fill:#552222;stroke:#552222;}#bytemd-mermaid-1741849232844-0 .edge-thickness-normal{stroke-width:2px;}#bytemd-mermaid-1741849232844-0 .edge-thickness-thick{stroke-width:3.5px;}#bytemd-mermaid-1741849232844-0 .edge-pattern-solid{stroke-dasharray:0;}#bytemd-mermaid-1741849232844-0 .edge-pattern-dashed{stroke-dasharray:3;}#bytemd-mermaid-1741849232844-0 .edge-pattern-dotted{stroke-dasharray:2;}#bytemd-mermaid-1741849232844-0 .marker{fill:#333333;stroke:#333333;}#bytemd-mermaid-1741849232844-0 .marker.cross{stroke:#333333;}#bytemd-mermaid-1741849232844-0 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#bytemd-mermaid-1741849232844-0 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#bytemd-mermaid-1741849232844-0 text.actor>tspan{fill:black;stroke:none;}#bytemd-mermaid-1741849232844-0 .actor-line{stroke:grey;}#bytemd-mermaid-1741849232844-0 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#bytemd-mermaid-1741849232844-0 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#bytemd-mermaid-1741849232844-0 #arrowhead path{fill:#333;stroke:#333;}#bytemd-mermaid-1741849232844-0 .sequenceNumber{fill:white;}#bytemd-mermaid-1741849232844-0 #sequencenumber{fill:#333;}#bytemd-mermaid-1741849232844-0 #crosshead path{fill:#333;stroke:#333;}#bytemd-mermaid-1741849232844-0 .messageText{fill:#333;stroke:none;}#bytemd-mermaid-1741849232844-0 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#bytemd-mermaid-1741849232844-0 .labelText,#bytemd-mermaid-1741849232844-0 .labelText>tspan{fill:black;stroke:none;}#bytemd-mermaid-1741849232844-0 .loopText,#bytemd-mermaid-1741849232844-0 .loopText>tspan{fill:black;stroke:none;}#bytemd-mermaid-1741849232844-0 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#bytemd-mermaid-1741849232844-0 .note{stroke:#aaaa33;fill:#fff5ad;}#bytemd-mermaid-1741849232844-0 .noteText,#bytemd-mermaid-1741849232844-0 .noteText>tspan{fill:black;stroke:none;}#bytemd-mermaid-1741849232844-0 .activation0{fill:#f4f4f4;stroke:#666;}#bytemd-mermaid-1741849232844-0 .activation1{fill:#f4f4f4;stroke:#666;}#bytemd-mermaid-1741849232844-0 .activation2{fill:#f4f4f4;stroke:#666;}#bytemd-mermaid-1741849232844-0 .actorPopupMenu{position:absolute;}#bytemd-mermaid-1741849232844-0 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#bytemd-mermaid-1741849232844-0 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#bytemd-mermaid-1741849232844-0 .actor-man circle,#bytemd-mermaid-1741849232844-0 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#bytemd-mermaid-1741849232844-0 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}用户事务Undo LogRedo Log BufferRedo Log FileBinlog BufferBinlog File磁盘文件执行数据修改操作更改暂存于缓冲中日志已持久化数据修改最终确定开始事务记录修改前的状态记录修改的内容数据操作完成准备提交同步写入日志记录事务日志开始事务提交流程发送COMMIT命令确认日志已写入同步写入日志应用更改事务提交成功结束事务用户事务Undo LogRedo Log BufferRedo Log FileBinlog BufferBinlog File磁盘文件

在这个流程图中,我们描述了以下步骤:

  1. 用户通过执行START TRANSACTIONBEGIN或者DML语句发起一个事务。
  2. 事务执行数据修改,同时记录到Undo Log(记录修改前的状态)和Redo Log Buffer(记录修改的内容)。
  3. 事务数据预写入内存中的Redo Log Buffer,为提交做好准备,但这是临时的。
  4. 事务完成所有操作。
  5. 事务提交时,Redo Log Buffer中的内容被写入到磁盘上的Redo Log File,确保数据的持久性。
  6. 同时,事务的更改被记录到Binlog Buffer,为复制和数据恢复做准备。
  7. 执行COMMIT命令,请求提交事务。
  8. 在提交时,事务确保Redo Log Buffer和Binlog Buffer中的更改都已同步到各自的磁盘文件。
  9. 事务将修改最终应用到磁盘文件,完成数据的持久化。
  10. 返回事务提交成功的确认给用户。

其他问题

1、会不会出现数据库磁盘中的文件已经被修改,但是没有记录到binlog日志中的情况?

通常情况下,这种情况是不会发生的。因为数据库在执行写操作的时候,会先将操作记录在Binlog中,然后再修改磁盘中的对应数据库文件。这就是所谓的write-ahead logging(WAL,预写式日志),即修改磁盘中的文件之前,必须先将相关的操作信息写入日志。

数据库维护了一个缓冲区,当有数据需要写入磁盘时,首先将这些数据写入缓冲区,然后再由缓冲区将这些数据批量写入磁盘,这样可以提高数据写入磁盘的效率。

而缓冲区在将数据写入磁盘之前,必须先将相关的操作信息写入日志。也就是说,任何修改磁盘中文件的操作,必须先写入日志。只有在日志成功写入后,缓冲区的数据才能写入硬盘。这种机制保证了在数据库系统崩溃的情况下,可以通过重放日志来恢复数据,确保数据的最终一致性和原子性。

至于你提到的这种情况,可能是由于些别的情况,比如操作系统崩溃,数据库软件的bug等等,导致数据已经写入了磁盘但是日志还没有来得及写入。但是这种情况在正常操作下是非常少见的,一般只会在极端的情况下才会发生。

2、事务提交前直接把数据写入磁盘就能保证持久性,为什么还要用redo log呢?

1、性能问题,直接写入磁盘(随机写)的性能通常比顺序写入要差。直接写入磁盘是随机写入。而Redo Log通常是顺序写入的,这可以提高写入效率。

2、原子性,如果在将数据写入磁盘的过程中发生系统崩溃(如电源故障、硬件故障等),那么可能只有部分数据被写入,导致数据不一致。Redo Log通过记录事务所做的修改,可以在故障后重做这些操作,确保事务的原子性。

3、并发问题,在高并发环境下,如果每个事务都直接写入磁盘,那么在多个事务同时修改同一条记录时,可能会出现冲突。Redo Log通过记录事务所做的修改,可以在事务提交时快速完成,而不需要对数据行进行长时间的锁定。


转载来源:https://juejin.cn/post/7346113400646172711

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
12天前
|
数据可视化 关系型数据库 MySQL
ELK实现nginx、mysql、http的日志可视化实验
通过本文的步骤,你可以成功配置ELK(Elasticsearch, Logstash, Kibana)来实现nginx、mysql和http日志的可视化。通过Kibana,你可以直观地查看和分析日志数据,从而更好地监控和管理系统。希望这些步骤能帮助你在实际项目中有效地利用ELK来处理日志数据。
177 90
|
10天前
|
存储 SQL 关系型数据库
mysql的undo log、redo log、bin log、buffer pool
MySQL的undo log、redo log、bin log和buffer pool是确保数据库高效、安全和可靠运行的关键组件。理解这些组件的工作原理和作用,对于优化数据库性能和保障数据安全具有重要意义。通过适当的配置和优化,可以显著提升MySQL的运行效率和数据可靠性。
33 16
|
9天前
|
存储 SQL 关系型数据库
mysql的undo log、redo log、bin log、buffer pool
MySQL的undo log、redo log、bin log和buffer pool是确保数据库高效、安全和可靠运行的关键组件。理解这些组件的工作原理和作用,对于优化数据库性能和保障数据安全具有重要意义。通过适当的配置和优化,可以显著提升MySQL的运行效率和数据可靠性。
21 4
|
27天前
|
存储 缓存 关系型数据库
图解MySQL【日志】——Redo Log
Redo Log(重做日志)是数据库中用于记录数据页修改的物理日志,确保事务的持久性和一致性。其主要作用包括崩溃恢复、提高性能和保证事务一致性。Redo Log 通过先写日志的方式,在内存中缓存修改操作,并在适当时候刷入磁盘,减少随机写入带来的性能损耗。WAL(Write-Ahead Logging)技术的核心思想是先将修改操作记录到日志文件中,再择机写入磁盘,从而实现高效且安全的数据持久化。Redo Log 的持久化过程涉及 Redo Log Buffer 和不同刷盘时机的控制参数(如 `innodb_flush_log_at_trx_commit`),以平衡性能与数据安全性。
29 5
图解MySQL【日志】——Redo Log
|
4月前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
1299 31
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
3月前
|
监控 安全 Apache
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球广泛使用的Web服务器软件,支持超过30%的活跃网站。它通过接收和处理HTTP请求,与后端服务器通信,返回响应并记录日志,确保网页请求的快速准确处理。Apache日志分为访问日志和错误日志,对提升用户体验、保障安全及优化性能至关重要。EventLog Analyzer等工具可有效管理和分析这些日志,增强Web服务的安全性和可靠性。
|
1月前
|
存储 SQL 关系型数据库
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log、原理、写入过程;binlog与redolog区别、update语句的执行流程、两阶段提交、主从复制、三种日志的使用场景;查询日志、慢查询日志、错误日志等其他几类日志
121 35
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
|
6天前
|
监控 Java 应用服务中间件
Tomcat log日志解析
理解和解析Tomcat日志文件对于诊断和解决Web应用中的问题至关重要。通过分析 `catalina.out`、`localhost.log`、`localhost_access_log.*.txt`、`manager.log`和 `host-manager.log`等日志文件,可以快速定位和解决问题,确保Tomcat服务器的稳定运行。掌握这些日志解析技巧,可以显著提高运维和开发效率。
58 13
|
9天前
|
缓存 Java 编译器
|
5月前
|
XML JSON Java
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
568 3

相关产品

  • 云数据库 RDS MySQL 版