• MySQL三大日志详解:Undo Log、Redo Log和Binlog的作用与工作机制

MySQL三大日志详解:Undo Log、Redo Log和Binlog的作用与工作机制

2025-06-06 10:00:11 栏目:宝塔面板 95 阅读

前言

MySQL中的Undo Log、Redo Log 和Binlog是保障数据库事务安全、数据一致性和高可用性的核心组件。它们分工明确,协同工作,但各自有不同的设计目标和实现机制。

Undo Log:保障事务原子性与 MVCC 的基石

作用

Undo Log主要用于事务回滚以及实现多版本并发控制(MVCC)。在事务执行过程中,当进行诸如INSERT、UPDATE、DELETE等写操作时,数据库会将修改前的数据副本记录在Undo Log 中。这样一来,如果事务执行过程中出现异常或者用户主动执行ROLLBACK操作,数据库可以依据Undo Log中的记录,将数据恢复到事务开始前的状态,从而保证了事务的原子性,即事务中的所有操作要么全部成功执行,要么全部不执行。

同时,在MVCC场景下,当一个事务对数据进行修改时,其他事务在读取数据时,若读取的行被锁定,就可以从Undo Log中获取该行数据在之前版本的状态,实现非阻塞读,提升数据库的并发性能。

工作机制

根据操作类型,Undo Log可分为Insert Undo LogUpdate Undo Log

  • Insert Undo Log用于INSERT操作的回滚,它主要记录新插入记录的主键信息,回滚时只需依据该主键删除对应的记录即可。
  • Update Undo Log则用于UPDATEDELETE操作的回滚,它会记录被修改记录的旧值,即修改前的完整数据行。在回滚时,使用旧值覆盖当前值,以还原数据。

Undo Log存储在InnoDBUndo Tablespace中,其管理通过Rollback Segment(回滚段)来实现。每个Rollback Segment包含多个Undo Log Slot,用于存储Undo Log记录。

  • 事务启动时,会以轮询的方式从Rollback Segment中分配空闲的Slot
  • 事务提交后,Slot并不会立即释放,对于INSERT生成的TRX_UNDO_INSERT类型日志,事务提交后可立即释放;而对于UPDATE/DELETE生成的TRX_UNDO_UPDATE类型日志,由于MVCC可能仍需访问其历史版本,所以需保留至所有快照读不再引用,之后这些Slot中的Undo Log会被加入History List,由后台Purge线程异步清理。
  • 当事务回滚时,InnoDB会按照相反顺序处理Undo Log记录。对于Update Undo Log,执行更新操作,用旧值覆盖当前值,从而完成数据的回滚。在快照读时,InnoDB通过ReadView,依据隔离级别和事务ID,从Undo Log中读取历史版本数据,而非最新数据。Purge线程则负责在Undo Log记录不再被任何事务的ReadView引用时,对其进行清理,回收空间。

Redo Log:确保事务持久性的关键

作用

Redo Log主要用于确保事务的持久性。当事务提交时,MySQL并不会立刻将所有修改的数据刷新到磁盘,因为磁盘I/O操作相对较慢,这样会严重影响性能。而是先将修改内容记录到 Redo Log中,之后再异步地将数据写入磁盘。即使在数据库发生崩溃、断电等故障时,只要Redo Log 存在,系统在重启后就可以依据Redo Log中的记录,重新应用已提交事务的修改,保证已提交事务的数据不会丢失,从而实现事务的持久性。

工作机制

InnoDB采用Write-Ahead LoggingWAL)机制,即先写日志,再写磁盘。每次事务提交时,InnoDB会先将Redo Log写入磁盘,而后再逐步将实际修改的数据写入磁盘。在执行INSERT、UPDATEDELETE操作时,数据库会首先将修改记录写入Redo Log缓存。当事务提交时,系统会将Redo Log缓存中的内容刷入磁盘上的Redo Log文件。

Redo Log文件通常以循环的方式使用,当一个Redo Log文件写满后,会切换到下一个文件继续写入。InnoDB存储引擎中,Redo Log的写入操作是顺序的,这相较于随机写磁盘,大大提高了写入性能。在系统运行过程中,InnoDB会定期将Redo Log中的修改应用到数据页,并将脏页(即被修改但还未写入磁盘的数据页)刷新到磁盘。

当数据库崩溃后重启,MySQL会进入恢复阶段。首先,进行Redo前滚阶段,通过Redo Log 恢复已提交事务的数据页;然后,扫描未提交事务的Undo日志,并按日志序列号(LSN)逆序执行补偿操作,例如将INSERT操作补偿为DELETE操作,UPDATE操作还原为修改前的状态,从而确保数据库的数据一致性。

Binlog:数据备份、恢复与复制的利器

作用

Binlog(二进制日志)主要有两个重要作用。其一,用于数据库的点时间恢复。通过记录数据库执行的所有写操作,在需要时可以根据Binlog中的记录,将数据库恢复到指定时间点的状态。其二,在主从复制架构中,Binlog起着关键作用。主库将自身执行的写操作记录到Binlog中,从库通过读取主库的Binlog,并在本地重放这些操作,从而实现与主库的数据同步,保证主从库数据的一致性。

工作机制

Binlog记录的并非所有SQL语句,而是包含了已执行的SQL 语句(增、删、改)的反向信息。例如,DELETE操作在Binlog中对应的是反向插入操作;UPDATE操作对应的是更新前后的版本信息;INSERT操作对应的是DELETEINSERT操作。通过使用 mysqlbinlog工具解析Binlog,可以清晰地看到这些记录。

当一个事务提交时,该事务中的每一条SQL 语句(一个事务可能对应多条SQL语句)都会以特定格式记录在Binlog中。与Redo Log不同的是,Redo Log在事务开始后就逐步写入磁盘,而Binlog是在事务提交时一次性写入。Binlog的默认保留时间由expire_logs_days 参数设置,超过该时间的非活动日志文件会被自动删除。

在主从复制过程中,主库会将Binlog发送给从库,从库接收后,按照Binlog中的记录顺序,在本地依次执行相应的SQL操作,从而使从库的数据与主库保持一致。这种方式使得MySQL的主从复制架构能够高效地实现数据的同步与备份,为数据的高可用性和灾难恢复提供了有力支持。

关联与协同工作

事务处理过程中的协同

当一个事务开始执行,Undo Log率先发挥作用,以UPDATE操作为例:

  • 在对数据进行修改前,数据库会将原始数据记录到Undo Log中,为事务回滚提供依据,保障事务的原子性。同时Redo Log也开始记录事务执行过程中对数据的修改操作,将其写入 Redo Log` 缓存。
  • 随着事务推进,每一个写操作产生的变化,不仅记录在Redo Log缓存中,还会在Binlog中有所体现。Binlog在事务提交时,将事务涉及的SQL语句(增、删、改)以特定格式记录下来。当事务提交时,InnoDB会先将Redo Log缓存中的内容刷入磁盘上的Redo Log文件,确保已提交事务的修改不会因系统崩溃丢失,实现事务持久性;
  • 随后,Binlog也将事务记录写入文件,完成事务在二进制日志层面的记录。而Undo Log中的记录在事务提交后,对于INSERT类型日志可能会立即释放相关资源,对于UPDATE/DELETE 类型日志,因MVCC需求会保留一段时间,直至不再被引用后由Purge线程清理。
  • 在并发事务场景下,Undo Log实现的MVCC机制,使得读取操作可以从Undo Log获取数据历史版本,避免对正在修改的数据加锁,提升并发性能。与此同时,Redo Log持续记录事务修改,Binlog也记录着事务的写操作,三者协同保证并发事务处理的正确性和高效性。

流程图

故障恢复时的协作

MySQL 数据库遭遇崩溃、断电等故障后重启,Redo LogUndo Log会紧密配合完成数据恢复工作。

  • 首先,数据库进入Redo前滚阶段,通过Redo Log恢复已提交事务的数据页,将数据库状态恢复到故障发生前已提交事务修改后的状态。
  • 接着,数据库会扫描未提交事务的Undo日志,并按日志序列号(LSN)逆序执行补偿操作。例如,将未提交事务中的INSERT操作补偿为DELETE操作,UPDATE操作还原为修改前的状态,以此确保数据库的数据一致性。在这一过程中,Redo LogUndo Log相互配合,Redo Log恢复已提交事务,Undo Log回滚未提交事务,二者共同保证数据库在故障恢复后数据的完整性和一致性。

Binlog在故障恢复中,主要用于基于时间点的恢复。如果数据库因误操作等原因需要恢复到某个特定时间点的状态,可以通过解析Binlog,获取从数据库备份时间点到指定时间点之间的所有写操作记录,在恢复的数据库实例上重放这些操作,从而将数据库恢复到指定时间点的状态。

主从复制中的配合

MySQL主从复制架构中,Binlog是主从库数据同步的核心。主库在执行写操作时,将这些操作记录到Binlog中,从库通过I/O线程连接主库,获取主库的Binlog日志,并将其保存在从库的中继日志(Relay Log)中。

从库的SQL线程读取中继日志中的内容,并在本地依次执行相应的SQL操作,实现与主库的数据同步。在这一过程中,Redo LogUndo Log同样发挥着重要作用。从库执行中继日志中的 SQL操作时,如同在本地执行事务,Redo Log记录着这些操作对数据的修改,保障从库事务的持久性;Undo Log则用于处理可能的事务回滚,确保从库数据的一致性。

例如,当从库执行一个UPDATE操作时,Redo Log记录该操作的修改,Undo Log记录修改前的数据版本,若事务执行过程中出现异常,可通过Undo Log回滚事务;而Binlog则作为主从库数据同步的桥梁,源源不断地将主库的写操作传递给从库。

总结

理解这三大日志之间的协同关系,有助于数据库管理员更好地进行数据库管理、性能优化和故障排查,也能让开发人员在设计和开发数据库应用时,充分利用数据库特性,构建出更加稳定、可靠、高效的应用系统。

本文地址:https://www.yitenyun.com/272.html

搜索文章

Tags

数据库 API FastAPI Calcite 电商系统 MySQL Web 应用 异步数据库 数据同步 ACK 双主架构 循环复制 TIME_WAIT 运维 负载均衡 Deepseek 宝塔面板 Linux宝塔 Docker JumpServer JumpServer安装 堡垒机安装 Linux安装JumpServer esxi esxi6 root密码不对 无法登录 web无法登录 生命周期 SSL 堡垒机 跳板机 HTTPS 序列 核心机制 HexHub Windows Windows server net3.5 .NET 安装出错 HTTPS加密 宝塔面板打不开 宝塔面板无法访问 查看硬件 Linux查看硬件 Linux查看CPU Linux查看内存 InnoDB 数据库锁 Oracle 处理机制 连接控制 机制 无法访问宝塔面板 监控 Windows宝塔 Mysql重置密码 ES 协同 Serverless 无服务器 语言 开源 PostgreSQL 存储引擎 技术 group by 索引 Spring Redis 异步化 分页查询 高可用 服务器 管理口 缓存方案 缓存架构 缓存穿透 SQL 动态查询 响应模型 数据 主库 SVM Embedding 自定义序列化 GreatSQL 连接数 日志文件 MIXED 3 服务器性能 SQLark 云原生 PG DBA scp Linux的scp怎么用 scp上传 scp下载 scp命令 ​Redis 机器学习 推荐模型 R edis 线程 AI 助手 向量数据库 大模型 Netstat Linux 服务器 端口 Undo Log Linux 安全 工具 存储 查询 SQLite-Web SQLite 数据库管理工具 共享锁 OB 单机版 openHalo 电商 系统 Rsync Recursive 架构 R2DBC Postgres OTel Iceberg • 索引 • 数据库 RocketMQ 长轮询 配置 聚簇 非聚簇 数据分类 加密 redo log 重做日志 流量 sftp 服务器 参数 优化 万能公式 修改DNS Centos7如何修改DNS Hash 字段 磁盘架构 同城 双活 防火墙 黑客 Ftp 场景 信息化 智能运维 MVCC 人工智能 推荐系统 数据备份 MySQL 9.3 mini-redis INCR指令 RDB AOF 业务 缓存 窗口 函数 高效统计 今天这篇文章就跟大家 网络架构 网络配置 INSERT COMPACT Redisson 锁芯 向量库 Milvus Doris SeaTunnel 事务 Java 开发 线上 库存 预扣 核心架构 订阅机制 prometheus Alert 引擎 性能 Python B+Tree ID 字段 IT运维 不宕机 Web PostGIS 崖山 新版本 MongoDB 数据结构 数据脱敏 加密算法 数据类型 虚拟服务器 虚拟机 内存 传统数据库 向量化 读写 分布式 集中式 ZODB Canal 容器 容器化 网络故障 DBMS 管理系统 模型 filelock OAuth2 Token JOIN QPS 高并发 Redis 8.0 微软 SQL Server AI功能 自动重启 Pottery Testcloud 云端自动化 发件箱模式 部署 聚簇索引 非聚簇索引 排行榜 排序 速度 服务器中毒 分库 分表 事务隔离 SpringAI 锁机制 分页方案 排版 Entity 工具链 启动故障 数据页 SSH Caffeine CP Web 接口 1 悲观锁 乐观锁 StarRocks 数据仓库 池化技术 连接池 单点故障 Go 数据库迁移 MCP 开放协议 sqlmock LRU 数据集成工具 Redka 频繁 Codis 原子性 大表 业务场景 分页 意向锁 记录锁 AIOPS 优化器 Order 网络 分布式架构 分布式锁​ EasyExcel MySQL8 dbt 数据转换工具 IT 仪表盘 日志 对象 单线程 字典 InfluxDB 双引擎 RAG HelixDB 行业 趋势 Ansible 事务同步 国产数据库 Crash 代码 LLM UUIDv7 主键 List 类型 订单 线程安全 Pump UUID ID 主从复制 代理 Next-Key 编程 关系数据库 ReadView 产业链 兼容性 语句 Valkey Valkey8.0 播客 解锁 调优 恢复数据 数据字典 MGR 分布式集群 算法 失效 国产 用户 快照读 当前读 视图 GitHub Git 矢量存储 数据库类型 AI代理 查询规划 千万级 RR 互联网 慢SQL优化 Weaviate count(*) count(主键) 行数 神经系统 表空间 分布式锁 Zookeeper 拦截器 动态代理 并发控制 恢复机制 CAS 多线程 技巧 闪回