一、现象
系统预警提示磁盘空间不足:
排查发现数据库中存在#sql开头的文件,而且各个都不小,每个都有几十G的大小
然后搜到了这篇文章:
然后发现我这个是属于第二种,就是只有idb文件的这种情况。然后比较糟糕的是,我并不能确定,我这个临时文件之前的表结构是什么
二、解决方案
以想要删除的上图中的数据库为例,进入到自己业务数据库实例对应的information_schema数据库中,找到 INNODB_SYS_TABLES 这张表,在 NAME 这一列,按照下图所示的方式,根据文件名搜索到 TABLE_ID 。我这里要删除掉#sql-ib3264420-2285332718.ibd
用这个ID,到 INNODB_SYS_COLUMNS 表中就能找到这个表对应哪些列。
这里就可以凭借自己对业务表的了解,知道这张表,是哪张业务表产生的临时表了。
然后保险起见,在别的库中,新建下这张表,表名字可以随意起
然后把这张新建的表的.frm文件,拷贝到出现临时表的数据库文件路径下,然后把它重命名成跟要删除的文件同名的,保持.frm后缀。比如我要删除的临时文件是 #sql-ib3264420-2285332718.ibd
那重命名之后的文件就叫 #sql-ib3264420-2285332718.frm
这样.frm 和.ibd文件就成对出现了
这时,返回数据库 执行删表语句,注意表名要再文件名基础上增加 #mysql50#前缀
再看文件系统,临时表就已经不存在了