一、概念

1.1 InnoDB 中的表空间概念

从 InnoDB存储引擎的逻辑存储结构看,所有数据都被逻辑地存放在一个空间中,称之为表空间( tablespace)。表空间又由段(segment)、区( extent)、页(page)组成。页在一些文档中有时也称为块( block)。

空间表示一本书,段表示书中的章节,区表示每章节的小节,页表示书的每一页,行就是每页的每行数据。表空间里有多个段,一个段包含256个区,一个区包含64个页,一个页为16K。

InnoDB存储引擎的逻辑存储结构大致如图所示。

mysql 查询表空间信息_mysql 查询表空间信息


在innodb存储引擎中数据是按照表空间来组织存储的。表空间是表空间文件是实际存在的物理文件。

当我们创建一个表之后,在磁盘上会有对应的表名称.ibd的磁盘文件,这个文件就是这张表的表空间物理文件。

1.2 系统表空间的概念(共享表空间)

innodb系统表空间包含innodb数据字典(innodb相关对象的元数据),同时,**双写缓冲(doublewrite buffer)、改变缓冲(change buffer)和undo日志(undo logs)**等也存储于系统表空间中。

此外,系统表空间也包含用户在该表空间创建的表和索引等数据。由于系统表空间可以存储多张表,因此,其为一个共享表空间。系统表空间由一个或多个数据文件组成,默认情况下,其包含一个叫ibdata1的系统数据文件,位于mysql数据目录(datadir)下。

1.3 表空间的物理文件

Linux:

mysql 查询表空间信息_表空间_02


前三个为 mysql 的系统表空间和临时表空间,后面两个文件夹为新建的数据库内的表的表空间文件。Windows:

mysql 查询表空间信息_表空间_03

1.4 MySQL 版本的表空间区别

MySQL5.5默认是共享表空间 ,5.6中默认是独立表空间(表空间管理类型就这2种)

在 MySQL 5.6 之前,所有数据库的表所创建的表空间文件都是存储在系统表空间也就是共享表空间中的。

到了 5.6 版本及后续版本,MySQL 就将除了系统数据库和表的表空间数据存储在共享表空间中,其他用户创建的数据库和表生成的表空间文件都变成了一个单独的文件存储在服务器的磁盘上。

1.5 删除数据时表空间文件的变化

结合mysql官方网站的信息,个人是这样理解的。当你删除数据时,mysql并不会回收,被已删除数据的占据的存储空间,以及索引位。而是空在那里,而是等待新的数据来弥补这个空缺。物理文件还在,但是里面的数据不在了。

1.6 表空间基础概念

MySQL 使用表空间来管理磁盘上的数据文件,表空间在磁盘上的文件可以是单个文件或者是多个文件。表空间的大小是由其中的数据文件的大小总和决定的。

当表空间中的数据文件不足以存储表数据时,MySQL 可以自动地扩展表空间,增加一个或多个新的数据文件,以满足表数据的存储需求。

表空间在 MySQL 中的底层实现方式是通过文件系统来实现的。每个表空间都被映射到一个或多个文件,在文件系统中以文件的形式存在。这些文件通常位于操作系统的文件系统中的特定目录下,该目录通常称为数据目录。

1.7 系统表空间的概念(共享表空间/sys表空间)

Value部分的的组成是:name:size:attributes

默认情况下,MySQL会初始化一个大小为12MB,名为ibdata1文件,并且随着数据的增多,它会自动扩容。

这个ibdata1文件是系统表空间,也是默认的表空间,也是默认的表空间物理文件,也是传说中的共享表空间

关于这个共享表空间,直观上看,如果这个表空间能为multiple tables.存储数据,那么它就可以被称为共享表空间,所以你可以认为系统表空间是共享表空间。

二、操作

2.1 查看是否设置了每一个数据库表都有一个独立的表空间文件

show variables like '%innodb_file_per_table%';

mysql 查询表空间信息_MySQL_04


其中如果 Value 为 ON 则表示每个数据库表都有一个独立的表空间文件,如为其他参数则表示没有。

MySQL 5.6 及以后的版本默认是开启状态,以前的版本每张表没有单独了表空间文件,数据和结构都是存储在共享表空间中的。

2.2 查询表空间文件的位置

SELECT @@datadir;

mysql 查询表空间信息_mysql_05

2.3 查询所有表空间和其详细信息

mysql 8:

SELECT * FROM information_schema.innodb_tablespaces;

mysql 查询表空间信息_表空间_06


mysql 5.6

SELECT * FROM information_schema.innodb_sys_tablespaces;

mysql 查询表空间信息_表空间_07

2.4 查看系统表空间(sys表空间)

show variables like '%innodb_data_file_path%';

mysql 查询表空间信息_数据库_08


其中的 Value 部分的含义为:name:size:attributes

在默认情况下,MySQL 会初始化一个大小为 12MB ,名为 ibdata1 的文件,而且这个文件可以随着数据量的增多自动扩容

2.5 配置系统表空间

修改 my.cnf 文件

innodb_data_file_path=/dir1/ibdata2:2000M:autoextend

可以指定目录,也可以不指定,使用默认目录

2.6 设置每一个数据库表都有一个独立的表空间文件

SET GLOBAL innodb_file_per_table=ON;

注意:这个参数在 MySQL 5.6 及以上的版本才可以使用

开启之后,创建表之后会自动生成一个名为:表名.ibd 的文件,该文件就是这张表的表空间文件。

2.7 表空间文件的默认存储路径

<mysql安装目录>/<数据库名>/表名.ibd

例如:

/var/lib/mysql/test/stydent.ibd

系统表空间和临时表空间的存储路径为:

/var/lib/mysql/ibdata1

/var/lib/mysql/ibtmp1

2.8 查看临时表空间

show variables like '%innodb_temp_data_file_path%'

mysql 查询表空间信息_MySQL_09


其中 Value 的含义和 上面的 系统表空间一致

2.9 查看 undo 表空间的使用情况

show variables like '%innodb_undo_tablespaces%';

mysql 查询表空间信息_MySQL_10


数量为 0 表示MySQL 是新安装的,其中的 undo表 还存在系统表空间中

有数量则表示 undo表空间 已经创建好了,这时候 undo表就存在了 undo表空间中

2.10 表空间的加密

MySQL 本身不直接提供表空间的加密功能,但是可以使用以下两种方式对表空间进行加密

2.10.1 因为表空间是一个物理文件,所以可以采用加密物理文件的方式对表空间文件进行加密

2.10.2 通过MySQL 的加密插件,例如:使用 MySQL Enterprise Edition 提供的 Transparent Data Encryption (TDE) 功能可以对 InnoDB 表空间进行加密。