essay

mysql中binlog和redolog的区别

#mysql

MySQL binlog 与 redo log 区别

核心一句话:

  • redo log:InnoDB 引擎专属,物理日志,负责崩溃恢复,保证已提交事务不丢失
  • binlog:MySQL Server 层日志,逻辑日志,负责时间点恢复 + 主从复制,记录所有修改逻辑

详细对比

维度 redo log binlog
归属层级 InnoDB 存储引擎专属,仅 InnoDB 可用 MySQL Server 层日志,与存储引擎无关(MyISAM、InnoDB 均可用)
日志类型 物理日志:物理日志:记录「数据页的物理变化」,即“某个数据页的某个偏移量,修改成了什么值”,与具体 SQL 无关 逻辑日志:记录「修改数据的逻辑操作」,可选两种格式:- statement 格式:记录完整 SQL 语句;- row 格式:记录行的前后变化(主流推荐)
写入方式 循环写:固定大小,写满覆盖旧日志,不会无限增大 追加写:不断向文件末尾追加,不会覆盖,按大小/时间切分文件
写入时机 事务执行中实时写入:执行修改操作即写入,不等待提交 事务提交时一次性写入:只有事务提交成功后才写入
核心作用 崩溃恢复:保证数据库宕机后数据不丢失(持久性) 主从复制 & 数据恢复:用于搭建主从架构、时间点恢复
清理方式 自动循环覆盖,无需手动管理 需配置过期时间自动清理,否则可能占满磁盘

补充说明
3.1 为什么需要两者配合?(两阶段提交)
单独依靠 redo log 或 binlog 都无法保证数据一致性,MySQL 通过「两阶段提交」让二者协同工作,确保崩溃后数据不丢失、主从一致:

    1. 事务执行完成,准备提交时,先写入 redo log,并标记为「prepare 状态」;
    1. redo log 刷盘成功后,再写入 binlog;
    1. binlog 刷盘成功后,将 redo log 标记为「commit 状态」,事务正式提交。

若某一步失败(如写入 binlog 时宕机),重启后 MySQL 会检查 redo log 状态:

  • 若 redo log 是 prepare 状态,但无对应 binlog:回滚事务;
  • 若 redo log 是 commit 状态:确认 binlog 完整,完成事务恢复。

3.2 常见场景对比(直观理解)
场景1:数据库突然宕机(断电)

  • redo log 作用:重启后,InnoDB 读取 redo log,将未刷盘的已提交数据恢复到数据文件,避免数据丢失;宕机时未提交的事务,重启后会通过 undo log 回滚,不会保留未提交的修改。
  • binlog 作用:无直接作用,因为 binlog 是事务提交后才写,宕机时未提交的事务不会写入 binlog,无需恢复。

场景2:误删表(drop table),需要恢复数据

  • redo log 作用:无作用,因为 redo log 是物理日志,仅记录数据页变化,无法回滚 drop 这类DDL操作;
  • binlog 作用:核心作用,通过备份文件恢复到误操作前的时间点,再重放 binlog 到误操作前的一秒,实现数据恢复。

场景3:主从复制,保证从库与主库一致

  • redo log 作用:无作用,仅负责主库自身的崩溃恢复;
  • binlog 作用:核心作用,主库将 binlog 发送给从库,从库通过重放 binlog 中的逻辑操作,实现与主库数据一致。

总结:

  • redo log 是 InnoDB 的“救命日志”,管「本地崩溃恢复」,防止宕机丢数据;binlog 是 MySQL 的“流水账日志”,管「时间点恢复 + 主从复制」,记录所有修改操作。
  • redo log 是物理日志、循环写、实时写;binlog 是逻辑日志、追加写、提交时写。
  • 二者协同工作(两阶段提交),才是 MySQL 数据一致性和高可用性的核心保障,缺一不可。
comments如果有不同意见或者补充,直接留在这里。
contact

在别处继续找到我

如果你想聊技术、设计,或者只是打个招呼。

暂未配置外部链接