在 MySQL 中,特别是 InnoDB 存储引擎,日志系统非常重要,主要包括以下三种日志:
1. Redo Log(重做日志)
组成部分
- Redo Log Buffer(缓冲区):用于暂时存储即将写入磁盘的日志信息。
- Redo Log File(文件):持久化存储的日志文件。
作用
- 记录在某个数据页上做了什么修改,确保在系统崩溃后能够恢复数据。
- 使 MySQL 拥有崩溃恢复能力。
刷盘机制
-
刷盘时机:
- 事务提交时。
- Log Buffer 空间不足(达到一半)。
- 事务日志缓冲满了。
-
刷盘策略(
innodb_flush_log_at_trx_commit
):- 0:事务提交时不刷盘,性能最好,但安全最差。
- 1:每次事务提交都刷盘,性能最差,但安全最好(默认)。
- 2:每次事务提交时将 Log Buffer 内容写入 Page Cache,性能和安全中等。
-
后台轮询:每秒一次的刷盘操作。
2. Binlog(大日志)
作用
- 记录所有涉及更新数据的逻辑操作,并且是顺序写入的。
记录格式
- Statement:完整保存 SQL 语句,但可能导致数据不一致(如使用
NOW()
)。 - Row:记录具体的操作,将
NOW()
变为当前时间戳。 - Mixed:混合模式,MySQL 会判断 SQL 是否会引起数据不一致。
问题和解决
- 在 Redo Log 保存时,如果 Binlog 尚未保存而 MySQL 崩溃,可能导致数据丢失。
- 解决方案:使用两阶段提交(Prepare 和 Commit 阶段),若崩溃发生在 Prepare 阶段,则事务会回滚。
3. Undo Log(回滚日志)
作用
- 记录每个事务操作的逻辑日志,确保事务的原子性。
结论
- MySQL InnoDB 引擎使用 Redo Log 保证事务的持久性,使用 Undo Log 保证事务的原子性。
- 数据备份、主备、主主、主从等操作均依赖 Binlog 来同步数据,确保数据一致性。