MySQL 主要有三种重要的日志:Redo Log(重做日志)、Undo Log(回滚日志)、Binlog(二进制日志)。它们在 事务管理、数据恢复和主从复制 中起着关键作用。
1. Redo Log(重做日志)—— 保证事务的持久性(crash-safe)
作用
- 记录事务操作(
INSERT/UPDATE/DELETE
)对数据页的修改,以支持 数据库崩溃后的数据恢复。 - 解决 MySQL InnoDB 引擎的 WAL(Write-Ahead Logging,预写日志) 机制。
- 保障事务 持久性(Durability,D),即 即使数据库宕机,也能恢复已提交事务的数据。
工作原理
- 事务执行时,先写 Redo Log,再更新数据页(WAL 机制)。
- 数据库崩溃后,InnoDB 可以用 Redo Log 进行数据恢复。
两部分
- Redo Log Buffer(内存中的重做日志)
- 事务执行时,先写入 内存(Redo Log Buffer)。
- Redo Log File(磁盘上的重做日志文件)
- 事务提交时,Redo Log 会刷盘,确保数据不会丢失。
刷盘策略
innodb_flush_log_at_trx_commit
参数控制:0
:每秒写入 OS 缓存,不立刻刷盘,可能丢失事务。1
(默认):事务提交时立即刷盘,最安全。2
:事务提交时写入 OS 缓存,每秒刷盘。
刷盘(Flush to Disk) 指的是 将数据从内存(Buffer)写入磁盘,确保数据持久化,防止系统崩溃时数据丢失。
在 MySQL 和操作系统的文件管理中,数据通常 不会立即写入磁盘,而是先存入内存缓冲区,以提高性能。只有在特定时刻,才会真正写入磁盘,这个过程就叫做 刷盘(Flush to Disk)。
2. Undo Log(回滚日志)—— 事务回滚 & MVCC
作用
- 事务回滚(Rollback):如果事务失败或
ROLLBACK
,可撤销未提交的修改。 - 多版本并发控制(MVCC):用于
REPEATABLE READ
隔离级别,支持 快照读,防止脏读/不可重复读。
工作原理
- 事务执行前,会把旧值保存到 Undo Log。
- 如果事务回滚,Undo Log 可用来恢复数据的旧值。
存储位置
- 存储在 InnoDB 的
rollback segment
(回滚段)中。 - 在事务提交后,Undo Log 可能会被删除(purge 机制)。
3. Binlog(二进制日志)—— 逻辑日志,支持主从复制 & 数据恢复
作用
- 记录所有对数据库的修改(
INSERT/UPDATE/DELETE
),不包含SELECT
。 - 用于数据恢复(point-in-time recovery)。
- 支持 MySQL 主从复制(Replication)。
- 支持增量备份(Incremental Backup)。
与 Redo Log 的区别
Redo Log | Binlog | |
---|---|---|
层级 | InnoDB 引擎层 | MySQL Server 层 |
记录内容 | 物理日志(数据页的更改) | 逻辑日志(SQL 语句) |
作用 | 保证事务持久化,崩溃恢复 | 主从复制、数据恢复 |
何时写入 | 事务执行时 | 事务提交时 |
是否可恢复未提交事务 | 可以 | 不行 |
存储方式 | 循环覆盖,空间固定 | 追加写入,可清理 |
存储格式
- Statement(语句级): 记录 SQL 语句。
- Row(行级,默认): 记录数据行的变化,最安全。
- Mixed(混合模式): 结合 Statement 和 Row。
存储位置
[mysqld]
log_bin = /var/log/mysql/binlog
查看 Binlog
SHOW BINARY LOGS; -- 查看 Binlog 文件
SHOW BINLOG EVENTS IN 'binlog.000001'; -- 查看 Binlog 事件
总结
日志类型 | 作用 | 存储位置 | 是否循环覆盖 | 作用范围 |
---|---|---|---|---|
Redo Log(重做日志) | 崩溃恢复,保证持久性 | InnoDB 引擎层 | 是 | 事务提交后仍有用 |
Undo Log(回滚日志) | 事务回滚、MVCC | InnoDB 回滚段 | 否(但可清理) | 事务回滚时使用 |
Binlog(二进制日志) | 数据恢复、主从复制 | MySQL Server 层 | 否(可手动清理) | 事务提交后写入 |
这三种日志共同保证 MySQL 数据的安全性、可恢复性、主从同步,是数据库事务管理的重要组成部分。