InnoDB
使用会话临时表空间和全局临时表空间。
会话临时表空间存储用户创建的临时表和优化器创建的内部临时表,当 InnoDB
被配置为磁盘上内部临时表的存储引擎时。磁盘上内部临时表使用 InnoDB
存储引擎。
会话临时表空间是从临时表空间池中分配给会话的,在第一次请求创建磁盘上临时表时分配。最多为会话分配两个表空间,一个用于用户创建的临时表,另一个用于优化器创建的内部临时表。分配给会话的临时表空间用于会话创建的所有磁盘上临时表。当会话断开连接时,其临时表空间将被截断并释放回池中。在服务器启动时创建一个包含 10 个临时表空间的池。池的大小永远不会缩小,并且在需要时会自动向池中添加表空间。临时表空间池在正常关机或中止初始化时被移除。会话临时表空间文件在创建时大小为 5 个页面,并具有 .ibt
文件扩展名。
为会话临时表空间保留了 40 万个空间 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 服务器关闭时被截断。
Information Schema INNODB_SESSION_TEMP_TABLESPACES
表提供有关会话临时表空间的元数据。
Information Schema INNODB_TEMP_TABLE_INFO
表提供有关在 InnoDB
实例中处于活动状态的用户创建的临时表的元数据。
全局临时表空间 (ibtmp1
) 存储对用户创建的临时表所做的更改的回滚段。
innodb_temp_data_file_path
变量定义了全局临时表空间数据文件的相对路径、名称、大小和属性。如果未为 innodb_temp_data_file_path
指定任何值,则默认行为是在 innodb_data_home_dir
目录中创建一个名为 ibtmp1
的单个自动扩展数据文件。初始文件大小略大于 12MB。
全局临时表空间在正常关机或中止初始化时被移除,并在每次服务器启动时重新创建。全局临时表空间在创建时会收到一个动态生成的 space ID。如果无法创建全局临时表空间,则会拒绝启动。如果服务器意外停止,全局临时表空间不会被移除。在这种情况下,数据库管理员可以手动移除全局临时表空间或重新启动 MySQL 服务器。重新启动 MySQL 服务器会自动移除并重新创建全局临时表空间。
全局临时表空间不能驻留在原始设备上。
Information Schema 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 节,“INFORMATION_SCHEMA 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
需要重新启动服务器。