如何修改mysql数据库的临时表空间大小

以MySQL 8.0为例,通过查看8.0的官方文档,我们知道8.0的临时表空间分为会话临时表空间和全局临时表空间。当InnoDB被配置为磁盘内部临时表的存储引擎时,会话临时表空间存储用户创建的临时表和优化器创建的内部临时表。当会话断开时,它的临时表空间将被截断并释放回池中。也就是说,在8.0中,有一个特殊的会话临时表空间,当会话被杀死时,可以回收磁盘空间;原来的ibtmp1是当前的全局临时表空间,存储了改变用户创建的临时表的回滚段。在5.7中,ibtmp1存储用户创建的临时表和磁盘内部的临时表。

也就是说,ibtmp1的用法在8.0和5.7中发生了变化。5.7版临时表的数据存储在ibtmp1中,8.0版临时表的数据存储在会话临时表空间中。如果临时表发生更改,更改后的撤消数据将存储在ibtmp1中。

实验验证:将之前的查询结果保存为临时表,对应的session为45号,通过查看对应的dictionary表,可以看到45号会话使用了表空间temp_8.ibt,通过将查询保存为临时表,可以使用会话临时表空间,如下图:

接下来kill session 45,发现temp_8.ibt空间已经被释放,变成初始大小,状态为inactive,证明mysql8.0中可以通过kill session释放临时表空间。

总结:在mysql5.7中,当会话被杀死时,临时表会被释放,但不会仅仅通过在ibtmp文件中进行标记就将空间释放回操作系统。如果要释放空间,需要重启数据库;在mysql8.0中,可以通过终止会话来释放临时表空间。