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 通过「两阶段提交」让二者协同工作,确保崩溃后数据不丢失、主从一致:
-
- 事务执行完成,准备提交时,先写入 redo log,并标记为「prepare 状态」;
-
- redo log 刷盘成功后,再写入 binlog;
-
- 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 数据一致性和高可用性的核心保障,缺一不可。