详解Mysql的 Binlog、UndoLog 和 RedoLog
MySQL 中有三种重要的日志机制:Binlog(二进制日志)、UndoLog(回滚日志)和 RedoLog(重做日志)。它们在数据库系统中扮演着不同的角色,共同保障了数据库的可靠性、一致性和可恢复性。
1. Binlog (Binary Log,二进制日志)
基本概念
Binlog 是 MySQL Server 层实现的二进制日志,记录了对数据库执行的所有更改操作(DDL 和 DML),但不包括 SELECT 和 SHOW 这类不修改数据的操作。
主要特点
-
服务层实现:与存储引擎无关,所有引擎都会产生 binlog。
-
追加写入:以追加方式写入文件,不会覆盖旧日志。
-
三种格式:
-
STATEMENT:记录 SQL 语句本身。
-
ROW:记录行的变更(默认格式)。
-
MIXED:混合模式,根据情况自动选择。
-
主要用途
-
主从复制:从库通过重放主库的 binlog 实现数据同步。
-
数据恢复:可以通过 binlog 进行时间点恢复。
-
数据审计:可以通过分析 binlog 追踪数据库变更。
工作流程
-
事务执行过程中,将变更记录到 binlog cache。
-
事务提交时,将 binlog cache 写入 binlog 文件。
-
根据 sync_binlog 参数决定何时刷盘(0-系统决定,1-每次提交,N-每N次提交)。
2. UndoLog (回滚日志)
基本概念
UndoLog 是 InnoDB 存储引擎特有的日志,用于记录事务发生前的数据状态,主要用于事务回滚和 MVCC 实现。
主要特点
-
逻辑日志:记录与执行操作相反的操作(如 INSERT 对应 DELETE)。
-
存储在系统表空间:默认存储在 ibdata1 文件中。
-
多版本控制:支持 MVCC(多版本并发控制)。
主要用途
-
事务回滚:事务失败时回滚到之前的状态。
-
MVCC 实现:提供数据的多版本读视图。
-
崩溃恢复:帮助恢复未完成的事务。
工作流程
-
事务开始前,记录修改前的数据到 undo log。
-
如果事务需要回滚,根据 undo log 恢复原始数据。
-
事务提交后,undo log 不会立即删除,可能被其他事务的 MVCC 读使用。
3. RedoLog (重做日志)
基本概念
RedoLog 是 InnoDB 特有的物理日志,记录的是"在某个数据页上做了什么修改",用于崩溃恢复。
主要特点
-
物理日志:记录的是页的物理修改。
-
循环写入:固定大小,循环使用。
-
WAL 技术:Write-Ahead Logging,先写日志再写磁盘。
-
两阶段提交:与 binlog 配合实现数据一致性。
主要用途
-
崩溃恢复:确保已提交事务的持久性。
-
提高性能:将随机 IO 变为顺序 IO。
-
保证持久性:即使系统崩溃也能恢复已提交的数据。
工作流程
-
事务修改数据时,先修改内存中的缓冲池(Buffer Pool)。
-
将修改记录写入 redo log buffer。
-
根据 innodb_flush_log_at_trx_commit 参数决定刷盘时机:
-
0:每秒刷盘一次。
-
1:每次事务提交都刷盘(默认)。
-
2:每次提交只写入文件系统缓存。
-
4. 三者的协同工作
在事务提交时,这三种日志的协作流程(以默认设置为例):
-
事务开始。
-
记录 undo log(用于回滚)。
-
执行 SQL,修改 Buffer Pool 中的数据页。
-
记录 redo log(准备状态)。
-
记录 binlog。
-
提交事务,redo log 状态改为 commit。
-
后台线程将脏页刷盘。
这个过程采用了"两阶段提交"来保证 redo log 和 binlog 的一致性。
5. 对比总结
特性 | Binlog | UndoLog | RedoLog |
---|---|---|---|
层级 | MySQL Server 层 | InnoDB 引擎层 | InnoDB 引擎层 |
类型 | 逻辑日志 | 逻辑日志 | 物理日志 |
内容 | SQL 或行变更 | 反向操作 | 页的物理修改 |
用途 | 复制、恢复、审计 | 事务回滚、MVCC | 崩溃恢复 |
生命周期 | 可配置保留时间 | 事务结束后可能保留 | 循环覆盖使用 |
持久化时机 | 事务提交时 | 事务开始前 | 事务过程中 |
6. 实际应用中的注意事项
-
性能调优:
-
sync_binlog 和 innodb_flush_log_at_trx_commit 参数影响性能和数据安全性。
-
适当增大 redo log 大小可以减少刷盘频率。
-
-
备份恢复:
-
结合 binlog 可以实现时间点恢复。
-
全量备份+binlog 是常见的备份策略。
-
-
主从复制:
-
基于 binlog 的主从复制有延迟问题。
-
半同步复制可以部分解决数据一致性问题。
-