Redo log 和 Binlog 的本质区别
编辑
33
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 状态]
- 0
- 0
-
分享