千家信息网

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

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要介绍MySQL中InnoDB存储引擎架构的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!InnoDB组件结构:buffer pool : 缓冲池,缓存磁盘的
千家信息网最后更新 2026年10月31日MySQL中InnoDB存储引擎架构的示例分析

这篇文章主要介绍MySQL中InnoDB存储引擎架构的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

InnoDB组件结构:

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

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

  3. 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 来配置。

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

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

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

  1. 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的区别

  • redo log:记录的是偏物理性质重做日志,比如 "对哪个数据页中的什么记录,做了哪些修改"

  • binlog:偏向于逻辑性的日志,如:"对users表中的id=10的一行数据做了更新操作,更新以后的值是什么"

2) 提交事务的时候同时写入binlog

在执行更新的同时,innoDB与执行器一直在交互,包括加载数据到缓冲池,写入undo日志文件,更新内存数据,写redo日志和刷入磁盘等。而对binlog的写入也是由执行器执行。

其中 1、2、3、4步骤为执行更新语句做的事,而 5、6是提交事务开始做的事。

3) binlog日志刷盘策略分析

sync_binlog参数控制binlog的刷盘策略

  1. sync_ binlog默认值是0,提交事务后,会把binlog日志存在 os cache 中,MySQL宕机后会造成os cache中数据的丢失

  2. sync_binlog 值为1,提交事务后,把binlog日志直接刷入磁盘中。

4) 基于binlog 和 redo log 完成事务的提交

binlog写入磁盘后,会把binlog日志文件所在的位置和文件名称都写入redo log日志文件中,同时在redo log日志文件里写入一个commit标记。

5) commit 标记有什么意义?

commit 标记意义着保持redo log 和 binlog 日志一致。如果在步骤5或者步骤6,事务提交开始,MySQL宕机了,redo log 中并没有commit标记,都算事务提交失败。

意味着 commint 标记是事务最终提交成功。

8. buffer pool 脏数据刷入磁盘

脏数据刷入磁盘是由后台IO线程随机刷入磁盘的。

这时候考虑到,在刷入磁盘之前,MySQL宕机怎么办?这时候,事务已经提交成功,redo log 中也有commit标记,就算宕机了,重启后,也会根据redo日志文件把数据更新到内存中,等待IO线程的刷盘。

以上是"MySQL中InnoDB存储引擎架构的示例分析"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

数据 日志 事务 磁盘 更新 文件 内存 缓冲 策略 标记 一致 成功 参数 同时 数据库 分析 步骤 影响 引擎 架构 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 哈尔滨大商圈互联网科技有限公司 互联网科技工作委员会副主任毛军 厦门中拓互联网络科技有限公司 猪兼强互联网科技 互联网科技集团 易通互联网络科技有限公司 互联网科技有限公司 翻译 互联网金融监管科技 成都仁贤领冠互联网科技有限公司 科技大学互联网专业好不好 哈尔滨秒房互联网科技有限公司 济南和联互联网科技有限公司 西藏七维空间互联网科技有限公司 福建科技产业互联网发展 深圳艾果互联网通讯科技 伊宁互联网科技做什么的 工业互联网科技成果转化 易企秀互联网科技是做什么的 湖北辰鑫科技互联网 颐高云石互联网科技 云南咖啡 互联网科技公司的优势 广州凡科互联网科技 互联网科技生活的内容 隆华科技工业互联网 互联网经济与金融科技 互联网科技大奖都有哪些公司 南博望互联网科技有限公司 四川互联网展示科技馆设计 好易买互联网科技
0