InnoDB表空间之临时表空间
在共享临时表空间中创建非压缩的,用户创建的临时表和磁盘内部临时表。的 innodb_temp_data_file_path
配置选项定义了相对路径,名称,规格,和用于临时表空间的数据文件属性。如果未指定任何值 innodb_temp_data_file_path
,则默认行为是ibtmp1
在 innodb_data_home_dir
目录中创建一个略大于12MB 的自动扩展数据文件 。
注意
在MySQL 5.6中,非压缩临时表是在临时文件目录中的每个表的每个文件表空间中创建的,或者在InnoDB
数据目录中的系统表空间中(如果 innodb_file_per_table
已禁用)创建的。MySQL 5.7中引入了共享临时表空间,从而消除了与为每个临时表创建和删除每表文件表空间相关的性能成本。专用的临时表空间还意味着不再需要将临时表元数据保存到InnoDB
系统表中。
压缩临时表是使用该ROW_FORMAT=COMPRESSED
属性创建的临时表,是 在临时文件目录中的每表文件表空间中创建的 。
在正常关闭或初始化中止时,将删除临时表空间,并在每次启动服务器时重新创建该临时表空间。临时表空间在创建时会接收动态生成的空间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.9节“ INFORMATION_SCHEMA文件表”。
或者,检查操作系统上的临时表空间数据文件大小。默认情况下,临时表空间数据文件位于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_engine
和 internal_tmp_disk_storage_engine
选项,这两个选项定义了分别用于用户创建的和磁盘上的内部临时表的存储引擎。这两个选项均InnoDB
默认设置为。的 MyISAM
存储引擎使用用于每个临时表,当临时表被删除被去除单个文件。
更多内容欢迎关注我的个人公众号“韩哥有话说”,100G人工智能学习资料,大量后端学习资料等你来拿。