17.6.3.5 临时表空间
InnoDB
使用会话临时表空间和全局临时表空间。
会话临时表空间
会话临时表空间存储用户创建的临时表和优化器在InnoDB
配置为磁盘内部临时表存储引擎时创建的内部临时表。磁盘内部临时表使用InnoDB
存储引擎。
会话临时表空间在首次请求创建磁盘临时表时从临时表空间池中分配给会话。一个会话最多分配两个表空间,一個用于用户创建的临时表和另一個用于优化器创建的内部临时表。会话临时表空间用于会话创建的所有磁盘临时表。当会话断开连接时,它们的临时表空间将被截断并返回到池中。服务器启动时创建一个临时表空间池,池的大小从不缩小,并且在需要时自动添加表空间。临时表空间池在正常关闭或初始化失败时被删除。会话临时表空间文件在创建时为五页大小,并具有.ibt
文件名扩展名。
reserved 400,000 个space ID用于会话临时表空间。由于服务器每次启动时重新创建临时表空间池,会话临时表空间的space 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 服务器关闭时才被截断。
表INNODB_SESSION_TEMP_TABLESPACES
提供了关于会话临时表空间的元数据信息。
信息_schema 表INNODB_TEMP_TABLE_INFO
提供了关于用户创建的活动临时表的元数据信息,该表位于InnoDB
实例中。
全局临时表空间
全局临时表空间(ibtmp1
)存储了对用户创建的临时表所做的更改的回滚段。
变量innodb_temp_data_file_path
定义了全局临时表空间数据文件的相对路径、名称、大小和属性。如果未指定innodb_temp_data_file_path
值,缺省行为是创建一个名为ibtmp1
的自动扩展数据文件,在innodb_data_home_dir
目录下。初始文件大小约为12MB。
全局临时表空间在正常关闭或初始化失败时被删除,并且每次服务器启动时重新创建。全局临时表空间在创建时获得动态生成的空间ID。如果无法创建全局临时表空间,服务器启动将被拒绝。全局临时表空间不会在服务器意外中止时被删除。在这种情况下,数据库管理员可以手动删除全局临时表空间或重新启动MySQL服务器。重新启动MySQL服务器将自动删除和重新创建全局临时表空间。
全局临时表空间不能位于原始设备上。
信息SchemaFILES
表提供了全局临时表空间的元数据。可以执行类似于以下查询来查看全局临时表空间元数据:
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 |
+------------------------------+
检查全局临时表空间数据文件大小,可以使用类似于以下查询的信息_schemaFILES
表:
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
显示当前全局临时表空间数据文件的大小。关于其他字段值的信息,请见第28.3.15节,“The INFORMATION_ SCHEMA FILES Table”。
或者,在操作系统上检查全局临时表空间数据文件大小。全局临时表空间数据文件位于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
配置innodb_temp_data_file_path
需要重新启动服务器。