InnoDB使用会话临时表空间和一个全局临时表空间。
会话临时表空间 #
当InnoDB被设置为存储引擎时,会话临时表空间会存储用户创建的临时表和优化器创建的内部临时表。从MySQL8.0.16开始,磁盘内部临时表使用的存储引擎是InnoDB。(之前,使用的存储引擎取决于internal_tmp_disk_storage_engine。)
在创建一个磁盘临时表时的第一个请求时,会话表空间被从一个临时表空间池分配给一个会话。一个会话最多分配两个表空间,一个用来存储用户创建的临时表,另一个存储优化器创建的内部临时表。分配给会话的临时表空间被用来存储会话创建的磁盘临时表。在一个会话断开连接时,它的临时表空间会被清空,然后归还到池子只能够去。在服务启动时,会黄健一个有10个临时表空间的池。池的大小不会缩减,只会按需增加。在正常关机和初始化失败时,会移除临时表空间池。在被创建时,会话临时表空间文件大小是5个页面,文件后缀名是.ibt。
为会话临时表空间保留的空间id数量是40万。因为服务每次启动时,都会重新创建会话临时表空间,所以在服务关闭时每个会话的临时表空间id不会持久化,可能会被重用。
innodb_temp_tablespaces_dir变量定义了会话临时表空间的存储位置。默认位置是数据目录下的#innodb_temp目录。如果无法创建临时表空间,启动会失败。
$> cd BASEDIR/data/#innodb_temp
$> ls
temp_10.ibt temp_2.ibt temp_4.ibt temp_6.ibt temp_8.ibt
temp_1.ibt temp_3.ibt temp_5.ibt temp_7.ibt temp_9.ibt
在基于语句的复制(SBR)模式下,在副本上创建的临时表会驻留在会话临时表空间中,直到MySQL实例关闭才会被清空。
Information Schema中的 INNODB_TEMP_TABLE_INFO 表提供了关于当前InnoDB实例中活跃的用户创建的临时表的元数据信息。
全局临时表空间 #
全局临时表存储用户创建的临时表所需的回滚段。
变量innodb_temp_data_file_path定义了全局临时表空间数据文件的相关路径,名称,大小和属性。如果没有指定值,会在innodb_data_home_dir目录下默认创建一个名称为ibtmp1的自动增长的数据文件。文件的初始大小是比12MB略大。
全局临时表空间文件不能驻留在一个原始设备上。
Information Schema中的FILES表提供了关于全局临时表空间的元数据。可以使用与下面的语句类似的语句来查看全局临时表空间元数据:
mysql> SELECT * FROM INFORMATION_SCHEMA.FILES WHERE TABLESPACE_NAME='innodb_temporary'\G
默认情况下,全局临时表空间数据文件是自动增长的。
要判断一个全局临时表空间数据文件是否自动增长,检查innodb_temp_data_file_path设置:
mysql> SELECT @@innodb_temp_data_file_path;
+------------------------------+
| @@innodb_temp_data_file_path |
+------------------------------+
| ibtmp1:12M:autoextend |
+------------------------------+
要查看全局临时表空间文件数据文件的大小,可以使用与下面类似的查询来检查Information Schema中的FILES表:
mysql> SELECT FILE_NAME, TABLESPACE_NAME, ENGINE, INITIAL_SIZE, TOTAL_EXTENTS*EXTENT_SIZE
AS TotalSizeBytes, DATA_FREE, MAXIMUM_SIZE FROM INFORMATION_SCHEMA.FILES
WHERE TABLESPACE_NAME = 'innodb_temporary'\G
*************************** 1. row ***************************
FILE_NAME: ./ibtmp1
TABLESPACE_NAME: innodb_temporary
ENGINE: InnoDB
INITIAL_SIZE: 12582912
TotalSizeBytes: 12582912
DATA_FREE: 6291456
MAXIMUM_SIZE: NULL
TotalSizeBytes展示了全局临时表空间数据文件当前大小。想了解更多关于其它字段的信息,请查看章节26.3.15,“INFORMATION_SCHEMA FILES表”。
或者,检查你的操作系统上全局临时表空间数据文件大小。全局临时表空间数据文件位于由变量innodb_temp_data_file_path定义的目录下。
要回收全局临时表空间数据文件占用的磁盘空间,重启MySQL服务。重启会移除并重建全局临时表空间数据文件(根据innodb_temp_data_file_path定义的参数重建)。
要限制全局临时表空间文件的大小,设置innodb_temp_data_file_path来显式指定一个文件最大值。例如:
[mysqld]
innodb_temp_data_file_path=ibtmp1:12M:autoextend:max:500M
修改设置后需要重启服务。