MySQL的临时表空间
2024-10-30 11:24 abce 阅读(104) 评论(0) 编辑 收藏 举报InnoDB使用会话临时表空间和全局临时表空间。
会话临时表空间
会话临时表空间用于存储用户创建的临时表,以及在InnoDB被配置为磁盘上内部临时表的存储引擎时由优化器创建的内部临时表。从 MySQL 8.0.16 开始,磁盘上内部临时表使用的存储引擎是InnoDB。(以前,存储引擎由internal_tmp_disk_storage_engine 的值决定)。
会话临时表空间是在首次请求创建磁盘上临时表时从临时表空间池中分配给会话的。一个会话最多可分配两个表空间,一个用于用户创建的临时表,另一个用于优化器创建的内部临时表。分配给会话的临时表空间用于会话创建的所有磁盘上临时表。当会话断开连接时,其临时表空间会被截断并释放回池中。服务器启动时会创建一个包含 10 个临时表空间的池。表空间池的大小永远不会缩减,表空间会根据需要自动添加到表空间池中。正常关机或初始化失败时,临时表空间池会被移除。会话临时表空间文件在创建时大小为 5 个页,文件扩展名为.ibt。
会话临时表空间预留了 40 万个空间 ID。由于会话临时表空间池在服务器每次启动时都会重新创建,因此会话临时表空间的空间 ID 在服务器关闭时不会被持久化,可以重复使用。
innodb_temp_tablespaces_dir变量定义了创建会话临时表空间的位置。默认位置是数据目录下的#innodb_temp目录。如果无法创建临时表空间池,系统将拒绝启动。
1 2 3 4 | $> 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_TEMP_TABLE_INFO表提供有关InnoDB实例中活动的用户创建的临时表的元数据。
全局临时表空间
全局临时表空间(ibtmp1 )存储对用户创建的临时表所做更改的回滚段。
innodb_temp_data_file_path变量定义了全局临时表空间数据文件的相对路径、名称、大小和属性。如果没有为innodb_temp_data_file_path 指定值,默认行为是在innodb_data_home_dir目录中创建一个名为ibtmp1的自动扩展数据文件。初始文件大小略大于 12MB。
全局临时表空间会在正常关机或初始化失败时移除,并在每次启动服务器时重新创建。全局临时表空间在创建时会收到一个动态生成的空间 ID。如果无法创建全局临时表空间,则会拒绝启动。如果服务器意外停止,也不会删除全局临时表空间。在这种情况下,数据库管理员可以手动删除全局临时表空间或重启 MySQL 服务器。重启 MySQL 服务器会自动移除并重新创建全局临时表空间。
全局临时表空间不能驻留在裸设备上。
Information Schema的FILES表提供有关全局临时表空间的元数据。请执行类似下面的查询来查看全局临时表空间元数据:
1 | mysql> SELECT * FROM INFORMATION_SCHEMA.FILES WHERE TABLESPACE_NAME= 'innodb_temporary' \G |
默认情况下,全局临时表空间数据文件会自动扩展,并根据需要增加大小。
要确定全局临时表空间数据文件是否自动扩展,请检查innodb_temp_data_file_path设置:
1 2 3 4 5 6 | mysql> SELECT @@innodb_temp_data_file_path; + ------------------------------+ | @@innodb_temp_data_file_path | + ------------------------------+ | ibtmp1:12M:autoextend | + ------------------------------+ |
要检查全局临时表空间数据文件的大小,请使用类似下面的查询检查 Information Schema的FILES表:
1 2 3 4 5 6 7 8 9 10 11 | 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显示全局临时表空间数据文件的当前大小。
或者,检查操作系统上的全局临时表空间数据文件大小。全局临时表空间数据文件位于innodb_temp_data_file_path变量定义的目录中。
要回收全局临时表空间数据文件占用的磁盘空间,请重新启动 MySQL 服务器。重启服务器会根据innodb_temp_data_file_path 变量定义的属性删除并重新创建全局临时表空间数据文件。
要限制全局临时表空间数据文件大小,可配置innodb_temp_data_file_path,指定最大文件大小。例如:
1 2 | [mysqld] innodb_temp_data_file_path=ibtmp1:12M:autoextend: max :500M |
配置innodb_temp_data_file_path需要重启服务器。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
2020-10-30 PostgreSQL在哪里存放默认的权限
2015-10-30 Oracle 12C -- 使用local PDB克隆新的PDB
2015-10-30 Oracle 12C -- Plug in a Non-CDB as a PDB
2015-10-30 ORA-65179: cannot keep datafiles for a pluggable database that is not unplugged