文章目录
接下来,再来看看InnoDB体系结构的右边部分,也就是磁盘结构:
![image-20240720223239043](https://img-blog.csdnimg.cn/img_convert/3651ddef16d1ae5ffb4158e623707253.png)
一、System Tablespace
系统表空间是Change Buffer(更改缓冲区)的存储区域。如果表是在系统表空间而不是每个表文件或通用表空间中创建的,它也可能包含表和索引数据。(在MySQL5.x版本中还包含InnoDB数据字典、undolog日志等,在8.x之后主要存放的就是Change Buffer(更改缓冲区)的存储区域)
如果InnoDB引擎中,每一张表的独立表空间关闭着的话,那么所有的表的数据以及索引也是在系统表空间存储。
参数:innodb_data_file_path
,表示表空间文件在哪。
系统表空间,默认的文件名叫 ibdata1,这个文件存放的就是系统表空间。
![image-20240721170402757](https://img-blog.csdnimg.cn/img_convert/048b67b92af409c9b4f640680d372e4f.png)
二、 File-Per-Table Tablespaces
每张表独立的表空间,就是在这块区域存放着的。
如果开启了innodb_file_per_table开关 ,则每个表的文件表空间包含单个InnoDB表的数据和索引 ,并存储在文件系统上的单个数据文件中。
开关参数:innodb_file_per_table ,该参数默认开启。开启就意味着我们所建立的每一张表都会有一个独立的表空间,并不会在System Tablespace中存放。
那也就是说,我们每创建一个表,都会产生一个表空间文件,进入 /var/lib/mysql/itcast
目录,如图:
以下文件,每一个文件都是一个表空间文件,在这个表空间文件中,它所存放的就是这张表的表结构,以及表中的数据、索引
三、 General Tablespaces
通用表空间,如果我们没有自己去创建,是没有这个表空间文件的。
需要手动通过 CREATE TABLESPACE 语法创建通用表空间,在创建表时,可以指定该表空间。
A. 创建表空间
指定表空间的名字,datafile:指定表空间关联的表空间文件,并且指定存储引擎
CREATE TABLESPACE xxxxx ADD DATAFILE 'file_name' ENGINE = engine_name;
B. 创建表时指定表空间
即这张表的数据就存放在这个表空间文件里
CREATE TABLE xxx ... TABLESPACE ts_name;
此时在 /var/lib/mysql
中就有 myitheima.ibd
文件了,这里面存放的表就是上面的a表。
通用表空间用的不多,了解一下即可。
四、Undo Tablespaces
撤销表空间,MySQL实例在初始化时会自动创建两个默认的undo表空间(初始大小16M),用于存储 undo log日志。
在这个里面会涉及到两个大小相同的表空间文件,这两个大小相同的表空间文件就叫做 undo_001
和 undo_002
,默认是这两个。
![image-20240721171234124](https://img-blog.csdnimg.cn/img_convert/260faee8cacb525f70d0e0d38c752518.png)
我们也可以到磁盘中看一下
![image-20240721171305338](https://img-blog.csdnimg.cn/img_convert/b9f4a8700e7a13afc9d39cbb109f0426.png)
五、Temporary Tablespaces
临时标记,InnoDB 使用会话临时表空间和全局临时表空间。存储用户创建的临时表等数据。
六、Doublewrite Buffer Files
双写缓冲区,innoDB引擎将数据页从我们刚才将的内存结构的Buffer Pool刷新到磁盘前,但是刷新到磁盘前,为了保证数据的安全性,先会将数据页写入双写缓冲区文件中,便于系统异常时恢复数据,保证数据的安全性。
双写缓冲区的两个文件如下图
![image-20240720223516244](https://img-blog.csdnimg.cn/img_convert/b2df724d680e1ac44dcbab513aed80d3.png)
这两个文件在我们磁盘中也是存在的
![image-20240721171511677](https://img-blog.csdnimg.cn/img_convert/5407311849d7540db923cac47f306d72.png)
七、Redo Log
重做日志,是用来实现事务的持久性。该日志文件由两部分组成:重做日志缓冲(redo log buffer)以及重做日志文件(redo log),前者是在内存中,后者在磁盘中。当事务提交之后会把所有修改信息都会存到该日志中, 用于在刷新脏页到磁盘时,发生错误时, 进行数据恢复使用。
以循环方式写入重做日志文件,它不会永久保存,它会每隔一段时间清理没有用的redo log,因为redo log当事务提交,那么这一块redo log实习上意义也就不大了,因为它的主要作用是保证异常时进行数据恢复,从而保证事务的持久性。
涉及两个文件,来循环写入这两个文件。
![image-20240720223537888](https://img-blog.csdnimg.cn/img_convert/ddfff208a687ac1b6ed6af8f201ca771.png)
前面我们介绍了InnoDB的内存结构,以及磁盘结构,那么内存中我们所更新的数据,又是如何到磁盘中的呢? 此时,就涉及到一组后台线程,接下来,就来介绍一些InnoDB中涉及到的后台线程。