当前位置: 首页 > article >正文

mysql的binlog,redolog,undolog作用

binlog是MySQL的服务器层日志,用于主从复制和数据恢复

redolog是InnoDB存储引擎的日志,确保事务的持久性,通过WAL机制。

undolog用于事务回滚和MVCC,保证原子性和一致性

事务处理中的具体应用:比如崩溃恢复时如何利用redolog和undolog,或者主从复制时binlog的作用。需要举例说明,比如事务提交时redolog的写入,或者回滚时undolog的使用。

对日志的写入时机和存储方式:比如redolog的循环写和binlog的追加写。需要解释这些设计选择的原因,比如redolog为了高效恢复,binlog为了记录所有变更。

混淆点:比如binlog和redolog的区别,虽然都用于恢复,但层次不同,用途不同。同时,undolog和redolog在事务处理中的协作,比如如何保证原子性和持久性。

最后,应该总结三者之间的关系,强调它们在事务ACID特性中的作用,帮助用户形成整体的理解框架。可能还需要指出常见问题,比如数据恢复的流程,或者主从复制的数据同步机制。

一、binlog(二进制日志)、redo log(重做日志)、undo log(回滚日志)

binlog(二进制日志)、redo log(重做日志)、undo log(回滚日志)是数据库系统中用于保证事务一致性、持久性和恢复能力的关键组件。以下是它们的核心区别和协作关系:


1. binlog(二进制日志)

  • 作用

    • 主从复制:记录所有数据库的修改操作(INSERT/UPDATE/DELETE),用于主从同步。

    • 数据恢复:通过 binlog 可以将数据库恢复到任意时间点(Point-in-Time Recovery)。

    • 审计:记录所有变更操作,便于审计。

  • 存储内容

    • 逻辑日志:记录的是 SQL 语句的原始逻辑(如 UPDATE table SET col=1 WHERE id=2),或基于行的变更(Row-Based)。

  • 写入时机

    • 事务提交时写入(COMMIT 之后)。

  • 存储方式

    • 追加写入,文件不断增长(可通过配置定期清理)。

  • 层级

    • MySQL 服务层实现,与存储引擎无关(所有引擎的修改都会被记录)。


2. redo log(重做日志)

  • 作用

    • 崩溃恢复:确保事务的持久性(Durability)。如果数据库崩溃,通过 redo log 重放未持久化的修改。

    • Write-Ahead Logging (WAL):修改数据前先写日志,避免直接写磁盘的性能问题。

  • 存储内容

    • 物理日志:记录的是数据页的物理修改(如“在表空间第 100 页的偏移量 200 处写入值 123”)。

  • 写入时机

    • 事务执行过程中持续写入(COMMIT 之前)。

  • 存储方式

    • 循环写入固定大小的文件(ib_logfile0ib_logfile1)。

  • 层级

    • InnoDB 存储引擎层实现,仅记录 InnoDB 引擎的修改。


3. undo log(回滚日志)

  • 作用

    • 事务回滚:记录事务修改前的旧值,用于回滚未提交的事务(保证原子性)。

    • 多版本并发控制(MVCC):提供历史版本数据,支持非锁定读(如 SELECT 语句不阻塞写操作)。

  • 存储内容

    • 逻辑日志:记录反向操作(如 INSERT 对应的 DELETEUPDATE 对应的旧值)。

  • 写入时机

    • 事务修改数据前写入。

  • 存储方式

    • 存储在 undo tablespace 中(MySQL 8.0 默认独立存储)。

  • 层级

    • InnoDB 存储引擎层实现。


二、三者的协作关系

  1. 事务提交流程

    • 修改数据前,生成 undo log(用于回滚)。

    • 修改数据时,写入 redo log(确保崩溃恢复)。

    • 事务提交时,redo log 刷盘(持久化),然后写入 binlog(主从复制和恢复)。

  2. 崩溃恢复

    • 通过 redo log 恢复未持久化的数据修改。

    • 通过 binlog 和 redo log 的一致性检查(两阶段提交),确保数据完整性。

  3. 事务回滚

    • 使用 undo log 回滚未提交的修改。

  4. MVCC 实现

    • 通过 undo log 构建历史版本数据,实现非锁定读。


三、关键区别总结

特性binlogredo logundo log
层级MySQL 服务层InnoDB 引擎层InnoDB 引擎层
日志类型逻辑日志(SQL 或行变更)物理日志(数据页修改)逻辑日志(反向操作)
用途主从复制、时间点恢复崩溃恢复、持久性事务回滚、MVCC
写入时机事务提交后事务执行中事务修改数据前
生命周期长期保留(可配置清理)循环覆盖事务结束后可清理

四、实际场景示例

1. 事务提交
  • 用户执行 UPDATE 操作:

    1. 生成 undo log(记录旧值)。

    2. 修改内存中的数据页,并写入 redo log(状态为 prepare)。

    3. 写入 binlog

    4. 提交事务,redo log 状态改为 commit

2. 崩溃恢复
  • 数据库崩溃后重启:

    1. 检查 redo log 中状态为 prepare 的日志。

    2. 比对 binlog,如果 binlog 已写入,则重放 redo log;否则回滚。

3. 主从复制
  • 主库将 binlog 发送给从库,从库重放 binlog 中的 SQL 语句,实现数据同步。


五、常见问题

  1. 为什么需要 redo log 和 binlog 同时存在?

    • redo log 是引擎层日志,保证崩溃恢复;binlog 是服务层日志,支持主从复制和全量恢复。两者分工不同。

  2. 如何保证 redo log 和 binlog 的一致性?(什么是两阶段提交)

    • 使用 两阶段提交(2PC):先写 redo log(prepare)→ 再写 binlog → 最后提交 redo log(commit)。

  3. undo log 会被持久化吗?

    • 是。undo log 存储在独立的表空间中,但长期未清理可能导致表空间膨胀(需定期清理或配置自动回收)。


通过这三类日志的协作,数据库系统能够实现 ACID 特性(原子性、一致性、隔离性、持久性),确保数据安全可靠。

六、什么是WAL

WAL(Write-Ahead Logging)机制是一种数据库技术,用于确保数据库事务的一致性和可靠性。‌‌1

WAL机制的基本概念和工作原理

WAL机制的核心思想是在对数据库进行任何持久性更改之前,先将更改记录到一个日志文件中。具体来说,当执行写操作时,数据并不会立即写入磁盘,而是先记录在日志中。这些日志文件通常包括:

  • Undo Log‌:用于事务回滚和多版本并发控制(MVCC),记录事务开始前的数据状态。
  • Redo Log‌:确保事务的原子性和持久性,记录事务中对数据的修改。
  • BinLog‌:用于主从复制,记录所有修改数据的SQL语句。

WAL机制的优势和应用场景

  1. 提高性能‌:通过将随机写操作转换为顺序写操作,WAL机制显著提高了写入性能,减少了I/O操作次数。
  2. 保证数据可靠性‌:即使在系统崩溃的情况下,WAL机制可以通过重放日志来恢复数据,确保数据的持久性。
  3. 支持即时备份‌:由于日志包含了所有更改信息,可以在任何时候创建一个完整的数据库快照,而不需要锁定表。

WAL机制在不同数据库系统中的应用实例

  • MySQL‌:InnoDB存储引擎实现了自己的WAL系统,称为redo日志。redo日志分为Redo Log Buffer和Redo Log Files,确保数据的一致性和持久性。
  • HBase‌:HBase的WAL机制通过先写日志再写磁盘的方式,提高了写入性能,并确保了数据的可靠性和一致性。

通过这些实例可以看出,WAL机制在提高数据库性能和保证数据可靠性方面发挥了重要作用。


http://www.kler.cn/a/581686.html

相关文章:

  • . 从理论到实践:小红书、京东如何玩转大模型
  • 虚拟机 CentOS 9 网络配置
  • 电机控制常见面试问题(六)
  • OTA自动化测试解决方案——实车级OTA测试系统PAVELINK.OTABOX:实车级OTA自动化系统|系统级OTA通道测试系统|系统级OTA压力测试系统|PAVELINK.OTABOX解决方案
  • 编程视界:C++命名空间
  • HTTP 强 Etag 和 弱 Etag
  • perl、python、tcl语法中读写Excel的模块
  • 文档解析:PDF、图片内容deepseek解析出错怎么办?
  • 设备物联网无线通信,ESP32-C3芯片模组方案,智能化联动控制
  • 从零到多页复用:我的WPF MVVM国际化实践
  • 人脸识别之数据集中 PI20 和 CFMT 之间关联的模型预测贝叶斯(Python+论文代码实现)
  • 开发常用软件
  • CVPR2025轨迹预测相关论文以及自动驾驶端到端相关论文
  • Android Service封装实战:基于Binder与接口的高效通信方案
  • 算法手记1
  • 【技术白皮书】内功心法 | 第二部分 | Telnet远程登录的工作原理
  • 使用pytest-xdist让自动化并行测试变得轻松简单
  • uniapp在APP平台(Android/iOS)选择非媒体文件
  • AI与.NET技术实操系列:ML.NET篇
  • conda 配置新环境时package will be install 和 package will be download 的区别