Rennen

Rennen

Redo log 和 Binlog 的本质区别

2024-06-12

每次因为面试复习 MySQL 的时候总能想到这个问题,干脆做个记录。


Redo Log 记录的是数据库的物理日志,即在数据页的哪些地方做了哪些修改;Binlog 记录的是数据库的逻辑日志,即执行了哪些具体的 SQL 语句。

前者用于故障恢复。后者用于全库备份、主从同步、数据订阅和消费。

我之前一直想不通的问题在于:为什么需要两份日志,两者是否可以只保留一个?

答案是不行

Redo Log 是 InnoDB 引擎特有的,采用顺序写入(Write Ahead Logging),效率更高,支持断电恢复。Binlog 属于 MySQL Server 层的日志,在 InnoDB 引擎没出来之前,许多工具(如 Canal)就已经依赖 Binlog 进行主从同步或者是数据订阅消费,因此仍然需要保留。

此外,Binlog 不记录哪些数据已经刷盘,哪些没有,这是存储引擎的工作。因此,Binlog 不具备 Crash Safe 能力。

题外话,存储引擎不只有 InnoDB,除了早期的 MyISAM 之外,还有根本无需写盘的 Memory 内存表。

另附:InnoDB 引擎下,update 语句的执行流程图

graph TD A[取 ID=2 这一行] --> B{数据是否在内存中?} B -- 否 --> C[磁盘中读入内存] C --> B B -- 是 --> D[返回行数据] D --> E[将该行的 C 值加 1] E --> F[写入新行] F --> G[新行更新到内存] G --> H[写入 redo log 处于 prepare 阶段] H --> I[写 binlog] I --> J[提交事务 处于 commit 状态]

参考:《MySQL 实战 45 讲》