一.redo log和binlog的区别
binlog
(二进制日志) 就像你的【财务总账】;redo log
(重做日志) 就像仓库的【临时出货单】
核心区别:binlog
负责“钱要对上”, redo log
负责“货不能丢”
二、核心区别对比表
特性 | Redo Log | Binlog |
---|---|---|
归属 | InnoDB 存储引擎层特有的 | MySQL Server 层实现的,所有存储引擎都可以使用 |
日志类型 | 物理日志 | 逻辑日志 |
记录内容 | 记录的是“在某个数据页上做了什么修改” | 记录的是原始SQL语句或行的变更逻辑(Statement 或 Row 格式) |
写入方式 | 循环写 | 追加写 |
文件大小 | 固定大小(如2个4GB文件),循环使用 | 文件大小可配置,写满后会切换到下一个,不会覆盖旧日志 |
主要用途 | 崩溃恢复 | 数据归档、主从复制、数据恢复 |
三.总结
“redo log
是 InnoDB 引擎的物理日志,用于崩溃恢复,它采用循环写的方式,为 Buffer Pool
提供了 WAL
(Write-Ahead Logging)能力,大幅提升了数据库的写性能。
binlog
是 Server 层的逻辑日志,主要用于数据归档和主从复制,它采用追加写的方式,记录了所有的数据变更逻辑。
它们通过两阶段提交机制协同工作,确保了在数据库发生崩溃时,数据的一致性和持久性。”
四.mysql的WAL机制
WAL 的全称是 Write-Ahead Logging,中文叫预写式日志。
它的核心原则非常简单且强大:在数据页被持久化到磁盘之前,必须先确保描述这次变更的日志已经持久化先写日志,再写磁盘的技术。
五、为什么需要 WAL?解决什么问题?
核心问题:磁盘 I/O 是数据库性能的主要瓶颈。
数据库的数据最终是存储在磁盘上的。如果每次执行一个 UPDATE
语句,都要等待随机 I/O 将对应的数据页写回磁盘,那么数据库的吞吐量将极其低下。
WAL 的解决方案:
- 将随机写变为顺序写:日志文件(如 Redo Log)是顺序追加写的,其速度远快于随机写数据页。
- 合并多次写操作:在内存中(Buffer Pool)对同一数据页的多次修改,最终只需要一次磁盘 I/O 写回数据文件。
总结
“WAL 是 InnoDB 存储引擎实现事务持久性的核心机制。它的核心思想是数据写入前,日志先行。
具体来说,当发生数据修改时,InnoDB 首先在内存的 Buffer Pool 中完成修改,生成脏页,然后立即将这次修改的物理日志顺序写入 Redo Log。事务提交时,只需保证 Redo Log 落盘即可,而脏页则由后台线程异步刷回磁盘。
这种设计通过将随机写转换为顺序写,极大地提升了数据库的写入吞吐量,同时通过 Redo Log 的崩溃恢复能力,确保了数据的持久性。”
六、Crash-Safe 是什么?一个简单的定义
Crash-Safe 指的是:即使数据库服务器在任何时候发生意外崩溃(如断电、系统宕机、内核恐慌),在重启后,数据库也能保证:
- 已提交的事务(Committed Transactions)的数据不会丢失。
- 未提交的事务(Uncommitted Transactions)的数据会被回滚。
核心目标:确保数据的 持久性 和 一致性。
七.两阶段提交:MySQL 将 redo log 的写入拆成了两个步骤:prepare 和 commit,中间再穿插写入binlog,这就是”两阶段提交”。
- Prepare 阶段:事务的 Redo Log 被写入,并标记为
prepare
状态。 - Commit 阶段:事务的 Binlog 被写入。
- 最终提交:Redo Log 被标记为
commit
。
崩溃时间点 | Redo Log 状态 | Binlog 状态 | 恢复动作 | 数据状态 |
---|---|---|---|---|
Prepare 前 | 未记录或未持久化 | 未记录 | 回滚事务 | 所有修改丢失 |
Prepare 后,Binlog 完成前 | prepare | 不完整或未记录 | 回滚事务 | 所有修改丢失 |
Binlog 完成后,Commit 前 | prepare | 完整记录 | 提交事务 | 数据完全恢复 |
Commit 后 | commit | 完整记录 | 提交事务 | 数据完全恢复 |
八.binlog 日志有三种格式
特性 | STATEMENT | ROW | MIXED |
---|---|---|---|
记录内容 | SQL 语句 | 被修改的行数据 | 自动选择 SQL 或 行数据 |
日志大小 | 小 | 可能非常大 | 中等 |
主从一致性 | 低(可能不一致) | 高(强一致) | 高 |
性能 | 写入性能好 | 写入和复制性能有压力 | 综合性能较好 |
可读性 | 好(直接看SQL) | 差(需要工具解析) | 混合 |
推荐度 | 不推荐 | 推荐(默认) | 推荐(旧版本) |