Documentation Home

14.6.3.5 临时表空间

非压缩的、用户创建的临时表和磁盘内部临时表是在共享临时表空间中创建的。该 innodb_temp_data_file_path 变量定义临时表空间数据文件的相对路径、名称、大小和属性。如果没有为 指定值 innodb_temp_data_file_path,则默认行为是创建一个自动扩展的数据文件 ,该文件ibtmp1innodb_data_home_dir目录中命名,略大于 12MB。

笔记

在 MySQL 5.6 中,非压缩临时表是在临时文件目录中的单个文件表空间中创建的,或者如果被禁用InnoDB ,则在数据目录中的系统表空间中 创建。innodb_file_per_tableMySQL 5.7 中共享临时表空间的引入消除了与为每个临时表创建和删除 file-per-table 表空间相关的性能成本。专用临时表空间还意味着不再需要将临时表元数据保存到InnoDB系统表中。

压缩临时表,即使用该ROW_FORMAT=COMPRESSED属性创建的临时表,是在 临时文件目录 下的file-per-table表空间中创建的。

临时表空间在正常关闭或中止初始化时被删除,并在每次服务器启动时重新创建。临时表空间在创建时接收动态生成的空间 ID。如果无法创建临时表空间,则拒绝启动。如果服务器意外停止,临时表空间不会被删除。在这种情况下,数据库管理员可以手动删除临时表空间或重新启动服务器,这会自动删除并重新创建临时表空间。

临时表空间不能驻留在原始设备上。

INFORMATION_SCHEMA.FILES提供有关InnoDB临时表空间的元数据。发出类似于此的查询以查看临时表空间元数据:

mysql> SELECT * FROM INFORMATION_SCHEMA.FILES WHERE TABLESPACE_NAME='innodb_temporary'\G

INFORMATION_SCHEMA.INNODB_TEMP_TABLE_INFO 提供有关实例中当前处于活动状态的用户创建的临时表的元数据InnoDB。有关详细信息,请参阅 第 14.16.7 节,“InnoDB INFORMATION_SCHEMA 临时表信息表”

管理临时表空间数据文件大小

默认情况下,临时表空间数据文件是自动扩展的,并根据需要增加大小以容纳磁盘上的临时表。例如,如果一个操作创建了一个大小为 20MB 的临时表,创建时默认大小为 12MB 的临时表空间数据文件将扩展大小以容纳它。当删除临时表时,释放的空间可以重新用于新的临时表,但数据文件仍保持扩展大小。

在使用大型临时表或广泛使用临时表的环境中,自动扩展临时表空间数据文件可能会变大。使用临时表的长时间运行的查询也可能导致大型数据文件。

要确定临时表空间数据文件是否自动扩展,请检查 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值报告临时表空间数据文件的当前大小。有关其他字段值的信息,请参阅 第 24.3.9 节,“INFORMATION_SCHEMA FILES 表”

或者,检查操作系统上的临时表空间数据文件大小。默认情况下,临时表空间数据文件位于 innodb_temp_data_file_path 配置选项定义的目录中。如果未明确为此选项指定值, ibtmp1则会在中创建 名为的临时表空间数据文件innodb_data_home_dir,如果未指定,则默认为 MySQL 数据目录。

要回收临时表空间数据文件占用的磁盘空间,请重新启动 MySQL 服务器。重新启动服务器会根据 定义的属性删除并重新创建临时表空间数据文件 innodb_temp_data_file_path

为防止临时数据文件变得太大,您可以配置 innodb_temp_data_file_path 变量以指定最大文件大小。例如:

[mysqld]
innodb_temp_data_file_path=ibtmp1:12M:autoextend:max:500M

当数据文件达到最大大小时,查询将失败并显示表已满的错误。配置 innodb_temp_data_file_path 需要重新启动服务器。

或者,配置 default_tmp_storage_engineinternal_tmp_disk_storage_engine 变量,它们分别定义用于用户创建的和磁盘内部临时表的存储引擎。默认情况下,这两个变量都设置为 InnoDB。存储引擎为每个临时表使用一个单独的文件,当删除临时表时,该 MyISAM文件将被删除。