14.6.3.5 临时 table 空间

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

Note

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

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

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

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

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

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

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

Management 临时 table 空间数据文件大小

默认情况下,临时 table 空间数据文件是自动扩展的,并且会根据需要增加其大小以容纳磁盘上的临时 table。例如,如果某个操作创建的临时 table 大小为 20MB,则临时 table 空间数据文件(在创建时默认为 12MB)会扩展大小以容纳该 table。删除临时 table 后,可用空间可用于新的临时 table,但数据文件将保持扩展大小。

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

要确定临时 table 空间数据文件是否正在自动扩展,请检查innodb_temp_data_file_path设置:

mysql> SELECT @@innodb_temp_data_file_path;
+------------------------------+
| @@innodb_temp_data_file_path |
+------------------------------+
| ibtmp1:12M:autoextend        |
+------------------------------+

要检查临时 table 空间数据文件的大小,请使用类似于以下查询的方法查询INFORMATION_SCHEMA.FILEStable:

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值报告临时 table 空间数据文件的当前大小。有关其他字段值的信息,请参见第 24.9 节“ INFORMATION_SCHEMA FILEStable”

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

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

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

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

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

或者,配置default_tmp_storage_engineinternal_tmp_disk_storage_engine选项,这两个选项定义了分别用于用户创建的和磁盘上的内部临时 table 的存储引擎。这两个选项默认都设置为InnoDBMyISAM存储引擎为每个临时 table 使用一个单独的文件,该文件在删除临时 table 时将被删除。