当前位置: 首页 > MySQL数据库

MySQL中InnoDB存储引擎架构的示例分析

时间:2026-01-28 12:53:36

InnoDB组件结构:

    buffer pool : 缓冲池,缓存磁盘的数据

    redo log buffer :记录对缓冲池的操作,根据策略写入磁盘防止宕机但事务已经提交而丢失数据

    undo log :当对缓冲池的数据进行修改时,在事务未提交的时候都可以进行回滚,将旧值写入 undo 日志文件便于回滚,此时缓冲池的数据与磁盘中的不一致,是脏数据

1. Buffer Pool

假设现在有一条更新语句:

update users set name = 'lisi' where id = 1

需要更新到数据库,InnoDB会执行哪些操作呢?

首先,InnoDB会判读缓冲池里是否存在 id = 1 这条数据,如果不存在则从磁盘中加载到缓冲池中,而且还会对这行数据加独占锁,防止多个sql同时修改这行数据。

2. undo 日志文件

假设 id = 1 这条数据name原来的值 name = 'zhangsan',现在我们要更新为 name = 'lisi' , 那么我们就需要把旧值name='zhangsan'和id=1这些信息写入到undo日志文件中。

对于熟悉数据库的同学来说都了解事务的概念,在事务未提交之前,所有操作都有可能进行回滚,即可以把 name = 'lisi' 回滚到 name = 'zhangsan',所以将更新前的值写到undo日志文件。

3. 更新buffer pool 数据

在undo日志文件写入完毕之后,便开始更新内存中的这条数据。把 id = 1 的 name = 'zhangsan' 更新为 name = 'lisi'。这时内存中的数据已经更新完毕,但磁盘上的还没有变化,此时出现了不一致的脏数据。

这时可能有一个疑问,万一事务提交完成,但MySQL服务宕机了,而内存中的数据还没写入到磁盘,是不是会造成数据丢失而造成sql执行数据前后不一致?

4. redo log buffer

在InnoDB结构中,有一个 redo log buffer 缓冲区存放redo日志,所谓redo日志,例如 把id=1,name='zhangsan'修改为name='lisi' 便是一条日志。

但这时redo log buffer 还仅仅存在内存中,没能实现MySQL宕机后的数据恢复。

5. 事务没提交,数据库宕机后有影响吗?

其实并没有影响,事务没有提交,意味着执行没有成功,就算MySQL崩溃或者宕机后,内存中的 buffer pool 和 redo log buffer 修改过的数据都会丢失,也并不影响数据前后的一致性。如果事务提交失败,那数据库的数据更加不会改变。

6. 提交事务,redo日志的配置策略

在提交事务时,redo日记会根据策略实现把redo日志从 redo log buffer 里写入磁盘。策略通过 innoDB_flush_log_at_trx_commit 来配置。

    innoDB_flush_log_at_trx_commit的参数为0,就算事务提交后,也不会把redo日志写入磁盘。MySQL宕机后会内存中的数据会丢失。

    innoDB_flush_log_at_trx_commit的参数为1,事务提交后,redo日志会从内存刷入磁盘,只要事务提交成功,redo log 就必然存在磁盘里。

此时就算buffer pool 的数据没有刷进磁盘,也可以从redo log 中得知修改过哪些数据,MySQL宕机重启后,可以从redo日志中恢复修改的数据。

    innoDB_flush_log_at_trx_commit的参数为2,事务提交后,redo log 仅仅停留在 os cache 中,还没刷进磁盘,万一此时服务宕机了。那么os cache 中的数据也会丢失,即使事务提交成功,也会造成数据丢失。

看完这几种相信为了保证数据安全,参数为1是最佳策略。

7. 事务的最终提交,binlog

binlog其实是属于MySQL Server 的日志文件,而在这出提出是因为与redo log有着很大的关联。

1) biglog 与 redo log的区别

  • 英特尔与 Vertiv 合作开发液冷 AI 处理器
  • 英特尔第五代 Xeon CPU 来了:详细信息和行业反应
  • 由于云计算放缓引发扩张担忧,甲骨文股价暴跌
  • Web开发状况报告详细介绍可组合架构的优点
  • 如何使用 PowerShell 的 Get-Date Cmdlet 创建时间戳
  • 美光在数据中心需求增长后给出了强有力的预测
  • 2027服务器市场价值将接近1960亿美元
  • 生成式人工智能的下一步是什么?
  • 分享在外部存储上安装Ubuntu的5种方法技巧
  • 全球数据中心发展的关键考虑因素
  • 英特尔与 Vertiv 合作开发液冷 AI 处理器

    英特尔第五代 Xeon CPU 来了:详细信息和行业反应

    由于云计算放缓引发扩张担忧,甲骨文股价暴跌

    Web开发状况报告详细介绍可组合架构的优点

    如何使用 PowerShell 的 Get-Date Cmdlet 创建时间戳

    美光在数据中心需求增长后给出了强有力的预测

    2027服务器市场价值将接近1960亿美元

    生成式人工智能的下一步是什么?

    分享在外部存储上安装Ubuntu的5种方法技巧

    全球数据中心发展的关键考虑因素