MySQL(167)如何理解MySQL的Redo Log和Undo Log?

MySQL InnoDB 存储引擎使用 Redo Log 和 Undo Log 来实现数据的持久性和事务的原子性。了解这两种日志的工作原理和应用场景,可以帮助我们更好地理解 MySQL 的事务管理和恢复机制。

一、Redo Log(重做日志)

1. Redo Log 的作用

Redo Log 用于记录对数据页的物理修改,以实现数据库的持久性。Redo Log 可以在数据库崩溃时,用于恢复最近提交的事务,确保数据的一致性。

2. Redo Log 的特点

  • 顺序写入:Redo Log 是顺序写入磁盘的,写入性能较高。
  • WAL(Write-Ahead Logging)协议:在修改数据页前,先写 Redo Log,确保即使系统崩溃,数据也可以通过 Redo Log 恢复。

3. Redo Log 的工作机制

当一个事务对数据进行修改时,InnoDB 会先将修改记录写入 Redo Log,然后再更新缓冲池中的数据页。定期将缓冲池中的数据页刷新到磁盘上。

示例:Redo Log 的工作流程
sql 复制代码
-- 启动事务
START TRANSACTION;

-- 修改数据
UPDATE employees SET name = 'Alice' WHERE id = 1;

-- 提交事务
COMMIT;

-- 此时,修改记录已经写入 Redo Log,并且数据页被更新到缓冲池中

4. Redo Log 恢复机制

在数据库崩溃恢复时,InnoDB 会从 Redo Log 中重做所有已提交事务的所有修改,确保数据的一致性。

二、Undo Log(回滚日志)

1. Undo Log 的作用

Undo Log 用于记录事务对数据的逻辑修改,以支持事务的回滚和 MVCC(多版本并发控制)。当事务需要回滚时,可以通过 Undo Log 恢复原始数据。

2. Undo Log 的特点

  • 逻辑修改:Undo Log 记录的是数据的逻辑修改,如 DELETE 操作会记录插入一条记录。
  • MVCC 支持:Undo Log 支持 MVCC,通过保存数据的多个版本,实现一致性读。

3. Undo Log 的工作机制

当一个事务对数据进行修改时,InnoDB 会生成一条对应的 Undo Log 记录,用于回滚和 MVCC。对于每个数据修改操作,Undo Log 记录了该操作的反向操作。

示例:Undo Log 的工作流程
sql 复制代码
-- 启动事务
START TRANSACTION;

-- 修改数据
UPDATE employees SET name = 'Alice' WHERE id = 1;

-- 此时,生成 Undo Log 记录原始数据值

-- 回滚事务
ROLLBACK;

-- 通过 Undo Log 恢复原始数据值

4. Undo Log 和 MVCC

InnoDB 通过 Undo Log 实现 MVCC,支持快照读。事务启动时,会创建一个一致性视图,之后的查询操作读取该视图对应的数据版本。

示例:Undo Log 和 MVCC
sql 复制代码
-- 设置隔离级别为可重复读
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

-- 启动事务
START TRANSACTION;

-- 快照读
SELECT * FROM employees WHERE id = 1;

-- 另一个会话更新数据并提交
-- UPDATE employees SET name = 'Bob' WHERE id = 1;
-- COMMIT;

-- 快照读,读取的是事务开始时的数据快照
SELECT * FROM employees WHERE id = 1;

-- 提交事务
COMMIT;

在这个例子中,即使另一个会话对数据进行了更新并提交,当前事务仍然读取的是事务开始时的数据快照。Undo Log 保存了数据的旧版本,支持快照读。

三、Redo Log 和 Undo Log 的结合

Redo Log 和 Undo Log 是 InnoDB 实现事务的持久性和原子性的基础。Redo Log 确保数据的持久性,在系统崩溃后可以恢复已提交的事务;Undo Log 支持事务的回滚和 MVCC,确保数据的一致性。

事务提交过程示例

sql 复制代码
-- 启动事务
START TRANSACTION;

-- 修改数据
UPDATE employees SET name = 'Alice' WHERE id = 1;

-- 生成 Undo Log 记录
-- 写入 Redo Log
-- 更新缓冲池中的数据页

-- 提交事务
COMMIT;

-- 将 Redo Log 刷新到磁盘
-- 此时事务提交成功,数据持久化

四、总结

MySQL InnoDB 存储引擎通过 Redo Log 和 Undo Log 实现事务的持久性和一致性。Redo Log 用于记录物理修改,确保数据的持久性;Undo Log 用于记录逻辑修改,支持事务回滚和 MVCC。理解 Redo Log 和 Undo Log 的工作原理和应用场景,可以帮助开发者更好地设计和优化数据库应用,以实现高并发和高可靠性。

相关推荐
用户4099322502122 分钟前
银行转账不白扣钱、电商下单不超卖,PostgreSQL事务的诀窍是啥?
后端·ai编程·trae
懒惰蜗牛16 分钟前
Day27 | Java集合框架之List接口详解
java·后端·java-ee·list
武子康1 小时前
大数据-114 Flink DataStreamAPI 从 SourceFunction 到 RichSourceFunction 源函数的增强与实战
大数据·后端·flink
月疯1 小时前
FLASK与JAVA的文件互传(单文件互传亲测)
后端·python·flask
拾忆,想起2 小时前
RabbitMQ事务机制深度剖析:消息零丢失的终极武器
java·开发语言·分布式·后端·rabbitmq·ruby
Terio_my2 小时前
Spring Boot 热部署配置与禁用
java·spring boot·后端
我是华为OD~HR~栗栗呀3 小时前
Java面经(22届考研-华oD)
java·后端·python·华为od·华为
IT_陈寒3 小时前
SpringBoot3踩坑实录:一个@Async注解让我多扛了5000QPS
前端·人工智能·后端
大鱼七成饱5 小时前
Rust 新手必看:彻底搞懂 String 和 &str,不再被坑!
后端
野犬寒鸦5 小时前
从零起步学习Redis || 第五章:利用Redis构造分布式全局唯一ID
java·服务器·数据库·redis·分布式·后端·缓存