MySQL Innodb引擎

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
日志服务 SLS,月写入数据量 50GB 1个月
简介: 介绍MySQL Innodb相关知识

1、InnoDB的重要内存结构--缓存池

Innodb存储引擎中有一个非常重要对吧放在内存里的组件,就是缓存池(Buffer Pool),这里面会缓存很多的数据,以便于在后续查询的时候,如果这个数据已经在缓存池里面了,就可以不用去查询磁盘了,直接在内存中获取或者修改数据,避免频繁的IO。

2、如何让你更新的数据可以回滚--undo日志文件

如果我们更新了一条数据,如果这次更新是在一个事务里面的,那么这次更新在事务提交之前,我们是可以回滚这个事务的,也就是我们可以把数据在回滚回去,那这是怎么做到的呢?


Innodb存储引擎引入了一个undo日志文件,负责数据的回滚。在更新一条数据之前,会将原始数据先写入undo日志之中,如果我们要回滚事务,这需要从undo日志中拿出旧值覆盖即可。

image.png

3、万一系统宕机,如何避免数据丢失--Redo Log Buffer

我们知道,我们更新数据是在内存中的,这时候数据还没有进入磁盘之中,那么如果这时候我们的MySQL宕机了,内存中的数据比如会丢失,那怎么解决呢?


Innodb存储引擎为了解决这个问题,引入了一个新的内存结构Redo Log Buffer,在我们修改数据的时候,就必须把对内存所做的修改写入到Redo Log Buffer里面去,但是这个Redo Log Buffer还是在内存中的,如果这时候我们还没有提交事务,MySQL却突然宕机,必然会导致内存里Buffer Pool中的修改过的数据都丢失,同时写入Redo Log Buffer里面的数据肯定也会丢失,但是这种时候时候即使MySQL宕机数据丢失,也是没有关系的,因为我们的事务还没提交,也就是表示这个操作还没有执行成功,就算内存数据丢失了,磁盘数据也不会变化,你的执行也没有成功。 但是如果这时候事务已经提交了,我们的执行已经成功了,但是这时候MySQL却宕机了,那这时候肯定是不行的,毕竟我们都执行成功了,你不能说数据没了就没了。那怎么办呢?


那么我们可以想到,为了防止数据丢失,我们肯定要将数据持久化,也就是肯定要写入磁盘。 Innodb存储引擎确实也是这么做的,当我们想要提交一个事务的时候,会根据一个策略把redo日志从Redo Log Buffer里面写入到磁盘文件里面去,这样我们就可以保证即使MySQL宕机了,至少操作记录还是存在的,不会丢失,那么这个策略是什么呢?


这个策略通过innodb_flush_log_at_trx_commit参数来配置的,它有这么几个策略。 如果这个值为 0 ,那么提交事务的时候,不会把Redo Log Buffer里的数据刷入磁盘文件,此时如果事务已经提交了,MySQL却宕机了,那么你的数据妥妥的就没了,就可以考虑跑路了。 当这个值为 1 ,那么提交事务的时候,就必须把Redo Log Buffer从内存刷入到磁盘之中,只要事务提交成功了,那么就可以保证Redo Log一定已经在磁盘之中了,这时候就是MySQL宕机了,那么数据也不会丢。 当这个值为 2 ,那么提交事务的时候,会把Redo Log Buffer里面的数据写入磁盘对应的OS Cache里去,而不是直接进入磁盘,可能要1秒之后才会把OS Cache里面的数据写入到磁盘文件里面去,这时候就算MySQL宕机了,那么数据是不会丢失的,但是(凡是就怕但是),如果这时候连MySQL所在的这台机器也宕机了,那么数据还是妥妥的就丢了。


所以对应MySQL这种需要保持强一致性的引用,一定要保持这个参数的值为 1 ,保证不管是MySQL、还是机器挂了、至少数据不会丢失,也不用跑路。

4、Mysql binlog到底是什么

实际上我们上面说过的redo log,它是一种偏向物理性质的重做日志,因为它里面记录的是类似与这样的东西,“对哪个数据页中的什么记录,做了什么修改”;而且redo log本身是属于InnoDB存储引擎特有的一个东西。


而binlog叫做归档日志,它里记录的是偏向逻辑性的日志,类似与“对users表中的id=10这一行数据做了更新操作,更新以后的值是什么”。binlog不是innodb存储引擎特有的日志文件,是属于mysql server自己的日志文件。

5、提交事务的时候,同时会写入binlog

在我们提交事务的时候,会把redo log日志刷入磁盘,然后同时还会把这次更新对应的binlog日志写入到磁盘里面去。

6、binlog日志的刷盘策略

既然redo log有不同的刷盘策略,那么binlog肯定也有,binlog的刷盘策略通过sync_binlog参数进行控制,它有两个取值,分别为0和1。


sync_binlog=0,这个是其默认值,此时会将binlog先写入os cache里面去,然后经过一段时间之后再将其写入到磁盘上面去。这时候如果机器宕机,那么数据就会丢失。


sysc_binlog=1,此时在提交事务的时候,会强制把binlog直接写入到磁盘文件里面去,这样提交事务之后,就算机器宕机,磁盘上面的binlog日志也是不会丢失的。

7.基于binlog和redo log完成事务的提交

当我们把binlog写入到磁盘文件之后,接着就会完成最终的事务提交,此时会把本次更新对应的binlog文件名称和这次更新的binlog日志在文件里的位置,都写入到redo log日志文件里面去,同时在redo log日志文件里写入一个commit标记,在做完这个事情之后,才算最终完成了事务的提交。

8、最后一步在redo日志中写入commit标记的意义是什么?

commit标记用来保持redo log日志与binlog日志一致。 例如:假设提交事务的时候,必须要完成上面的5、6、7三个步骤,才算是提交了事务,那么如果有步骤没有完成会怎么样呢? 加入我们完成了步骤5的时候,也就是redo log刚刷入磁盘之后,MySQL就宕机了,这个时候因为没有最终的commit标记在redo日志里,所以此次事务可以判定不成功,不会因为redo日志文件里有这次更新的日志,但是binlog日志文件里没有这次更新的日志,不会出现日志不一致的问题。


如果完成了步骤6,redo log日志和binlog日志全都落盘了, 此时MySQL宕机了,那么因为redo log文件里面没有commit标记,因此这次事务提交也是失败的。


必须是在redo loh中写入最终的事务commit标记,然后此时事务提交成功,而且redo log里有本次更新对应发日志,binlog里面也有这次更新对应的日志,redo log和binlog完全是一致的。

9、后台IO先随机将内存更新后的脏数据刷入磁盘

在日志成功提交之后,我们的数据还是存在于内存之中(Buffer Pool),按这些数据肯定是要落盘的,这样才不会丢失,那么这个数据什么进入磁盘里面呢?


MySQL里面有一个后台的IO线程,会在某个时间里,随机的把内存Buffer Pool中的修改后的脏数据给刷回的磁盘上的数据文件里面去。


就算在刷盘之前mysql崩了或者机器崩了,也没关系,因为重启之后,会根据redo日志恢复之前提交事务做过的修改更新到内存里面去,然后等适当时机,IO线程再把这个修改后的数刷入到磁盘里面去。

10、总结

大家通过一次更新数据的流程,就可以清晰地看到,InnoDB存储引擎主要就是包含了一些buffer pool、redo log buffer等内存里的缓存数据,同时还包含了一些undo日志文件,redo日志文件等东西,同时mysql server自己还有binlog日志文件。


在你执行更新的时候,每条SQL语句,都会对应修改buffer pool里的缓存数据、写undo日志、写redo log buffer几个步骤;


但是当你提交事务的时候,一定会把redo log刷入磁盘,binlog刷入磁盘,完成redo log中的事务commit标记;最后后台的IO线程会随机的把buffer pool里的脏数据刷入磁盘里去。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
存储 缓存 关系型数据库
都说InnoDB好,那还要不要使用Memory引擎?
【11月更文挑战第16天】本文介绍了 MySQL 中 InnoDB 和 Memory 两种存储引擎的特点及适用场景。InnoDB 支持事务、外键约束,数据持久性强,适合 OLTP 场景;而 Memory 引擎数据存储于内存,读写速度快但易失,适用于临时数据或缓存。选择时需考虑性能、数据持久性、一致性和完整性需求以及应用场景的临时性和可恢复性。
|
9天前
|
存储 缓存 关系型数据库
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
MySQL的存储引擎是其核心组件之一,负责数据的存储、索引和检索。不同的存储引擎具有不同的功能和特性,可以根据业务需求 选择合适的引擎。本文详细介绍了MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案。
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
|
14天前
|
存储 关系型数据库 MySQL
MySQL存储引擎详述:InnoDB为何胜出?
MySQL 是最流行的开源关系型数据库之一,其存储引擎设计是其高效灵活的关键。InnoDB 作为默认存储引擎,支持事务、行级锁和外键约束,适用于高并发读写和数据完整性要求高的场景;而 MyISAM 不支持事务,适合读密集且对事务要求不高的应用。根据不同需求选择合适的存储引擎至关重要,官方推荐大多数场景使用 InnoDB。
61 7
|
23天前
|
存储 关系型数据库 MySQL
Mysql索引:深入理解InnoDb聚集索引与MyisAm非聚集索引
通过本文的介绍,希望您能深入理解InnoDB聚集索引与MyISAM非聚集索引的概念、结构和应用场景,从而在实际工作中灵活运用这些知识,优化数据库性能。
100 7
|
30天前
|
存储 关系型数据库 MySQL
MySQL引擎InnoDB和MyISAM的区别?
InnoDB是MySQL默认的事务型存储引擎,支持事务、行级锁、MVCC、在线热备份等特性,主索引为聚簇索引,适用于高并发、高可靠性的场景。MyISAM设计简单,支持压缩表、空间索引,但不支持事务和行级锁,适合读多写少、不要求事务的场景。
58 9
|
11天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
39 3
|
11天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
41 3
|
11天前
|
SQL 关系型数据库 MySQL
数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog
《数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog》介绍了如何利用MySQL的二进制日志(Binlog)恢复误删除的数据。主要内容包括: 1. **启用二进制日志**:在`my.cnf`中配置`log-bin`并重启MySQL服务。 2. **查看二进制日志文件**:使用`SHOW VARIABLES LIKE 'log_%';`和`SHOW MASTER STATUS;`命令获取当前日志文件及位置。 3. **创建数据备份**:确保在恢复前已有备份,以防意外。 4. **导出二进制日志为SQL语句**:使用`mysqlbinlog`
54 2
|
25天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
174 15
|
18天前
|
SQL 关系型数据库 MySQL
数据库数据恢复—Mysql数据库表记录丢失的数据恢复方案
Mysql数据库故障: Mysql数据库表记录丢失。 Mysql数据库故障表现: 1、Mysql数据库表中无任何数据或只有部分数据。 2、客户端无法查询到完整的信息。