Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

17.6.3.5 临时表空间

InnoDB 使用会话临时表空间和全局临时表空间。

会话临时表空间

会话临时表空间存储用户创建的临时表和优化器创建的内部临时表,当 InnoDB 配置为磁盘内部临时表的存储引擎时。

会话临时表空间是在会话第一次请求创建磁盘临时表时从池中分配的。每个会话最多分配两个表空间,一个用于用户创建的临时表,另一个用于优化器创建的内部临时表。会话的临时表空间用于会话创建的所有磁盘临时表。当会话断开连接时,其临时表空间将被截断并释放回池中。服务器启动时创建了一个包含 10 个临时表空间的池。池的大小永远不会缩小,并且表空间会根据需要自动添加到池中。池中的临时表空间在正常关闭或初始化失败时将被删除。会话临时表空间文件在创建时为五页大小,具有 .ibt 文件名扩展名。

为会话临时表空间保留了 400,000 个空间 ID 范围。由于池中的会话临时表空间是在服务器启动时重新创建的,因此会话临时表空间的空间 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 提供了会话临时表空间的元数据。

信息架构表 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 服务器将自动删除和重新创建全局临时表空间。

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

信息架构表 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        |
+------------------------------+

要检查全局临时表空间数据文件的大小,请检查信息模式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 显示全局临时表空间数据文件的当前大小。有关其他字段值的信息,请参阅第 28.3.15 节,“信息模式 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

配置innodb_temp_data_file_path需要重新启动服务器。