#### 15.6.3.5 临时表空间

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

##### 会话临时表空间

会话临时表空间存储用户创建的临时表和优化器创建的内部临时表`InnoDB`被配置为磁盘内部临时表的存储引擎。从 MySQL 8.0.16 开始，用于磁盘内部临时表的存储引擎是`InnoDB`.（以前，存储引擎是由[`internal_tmp_disk_storage_engine`](server-system-variables.html#sysvar_internal_tmp_disk_storage_engine).)

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

为会话临时表空间保留了 40 万个空间 ID。因为每次启动服务器时都会重新创建会话临时表空间池，所以会话临时表空间的空间 ID 在服务器关闭时不会保留，并且可以重复使用。

这[`innodb_temp_tablespaces_dir`](innodb-parameters.html#sysvar_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`](information-schema-innodb-session-temp-tablespaces-table.html)table 提供有关会话临时表空间的元数据。

这[`INFORMATION_SCHEMA.INNODB_TEMP_TABLE_INFO`](information-schema-innodb-temp-table-info-table.html)table 提供有关用户创建的临时表的元数据，这些临时表在`InnoDB`实例。

##### 全局临时表空间

全局临时表空间 (`ibtmp1`) 存储对用户创建的临时表所做的更改的回滚段。

这[`innodb_temp_data_file_path`](innodb-parameters.html#sysvar_innodb_temp_data_file_path)变量定义全局临时表空间数据文件的相对路径、名称、大小和属性。如果没有指定值[`innodb_temp_data_file_path`](innodb-parameters.html#sysvar_innodb_temp_data_file_path)，默认行为是创建一个名为`ibtmp1`在里面[`innodb_data_home_dir`](innodb-parameters.html#sysvar_innodb_data_home_dir)目录。初始文件大小略大于 12MB。

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

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

[`INFORMATION_SCHEMA.FILES`](information-schema-files-table.html)提供有关全局临时表空间的元数据。发出与此类似的查询以查看全局临时表空间元数据：

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

默认情况下，全局临时表空间数据文件会自动扩展并根据需要增加大小。

要确定全局临时表空间数据文件是否正在自动扩展，请检查[`innodb_temp_data_file_path`](innodb-parameters.html#sysvar_innodb_temp_data_file_path)环境：

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

要检查全局临时表空间数据文件的大小，请查询[`INFORMATION_SCHEMA.FILES`](information-schema-files-table.html)使用与此类似的查询的表：

```
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
```

`总大小字节`显示全局临时表空间数据文件的当前大小。有关其他字段值的信息，请参阅[第 26.3.15 节，“信息\_架构文件表”](information-schema-files-table.html).

或者，检查操作系统上的全局临时表空间数据文件大小。全局临时表空间数据文件位于由[`innodb_temp_data_file_path`](innodb-parameters.html#sysvar_innodb_temp_data_file_path)多变的。

要回收全局临时表空间数据文件占用的磁盘空间，请重新启动 MySQL 服务器。重新启动服务器会根据定义的属性删除并重新创建全局临时表空间数据文件[`innodb_temp_data_file_path`](innodb-parameters.html#sysvar_innodb_temp_data_file_path).

要限制全局临时表空间数据文件的大小，配置[`innodb_temp_data_file_path`](innodb-parameters.html#sysvar_innodb_temp_data_file_path)指定最大文件大小。例如：

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

配置[`innodb_temp_data_file_path`](innodb-parameters.html#sysvar_innodb_temp_data_file_path)需要重新启动服务器。
