redo log 的执行流程?

1 个回答

  • 凯恩
    改变的秘密,是把所有的精力全放在新的事物上,而不是与过去抗衡。
    **Redo log 的执行流程**可以概括为以下几个步骤,假设 SQL 操作为 `update T set a = 1 where id = 666`: ![image.png](https://images.codewd.com/140439d1e491f3f72c1b96cb68245e90.jpg "image.png") 1. **MySQL Server 接收 SQL 请求**: - MySQL 客户端将 SQL 语句 `update T set a = 1 where id = 666` 发往 MySQL 的 Server 层。 - MySQL Server 层接收请求后,对 SQL 语句进行解析、优化,并生成执行计划。 2. **InnoDB 存储引擎执行操作**: - MySQL Server 将生成的 SQL 执行计划发送到 InnoDB 存储引擎层,InnoDB 存储引擎负责执行实际的数据更新操作。 - InnoDB 首先将 `a = 1` 的修改记录到内存中(数据页的缓存),即修改相应的行。 3. **记录 Redo Log**: - InnoDB 随后会记录该操作到 **redo log**,即记录 "在哪个数据页上做了什么修改" 的信息到内存中的 **redo log buffer**。 - **Redo log** 只记录物理修改操作,而不是具体的 SQL 语句。 4. **事务状态设置为 Prepare**: - 记录完 **redo log** 后,InnoDB 会将事务的状态设置为 **prepare**,意味着事务已经准备好提交,但尚未提交。此时,系统确保所有的变更都可以恢复。 5. **MySQL Server 提交事务**: - MySQL Server 层继续处理事务的其他部分,最终会将事务的状态设置为 **commit**,即提交该事务。 6. **Redo Log 持久化**: - 收到事务提交请求后,**redo log** 将之前记录在 **redo log buffer** 中的内容写入磁盘中的 **redo log file**。这一过程确保事务操作得以持久保存,即使数据库崩溃,数据也能通过 **redo log** 恢复。 通过这些步骤,MySQL 确保了事务的持久性和安全性,特别是依靠 **redo log** 机制,MySQL 能够在系统崩溃后恢复未刷盘的数据,保证数据一致性。
    编辑于 2024-11-28 13:28 •IP属地 美国
    举报
    评论
    收藏