在mysql-data文件夹中巨大#sql-xxxx_xxxx.ibd文件

在我们的一个mysql数据库上,磁盘的大小比实际的数据(~5GB)要大得多(28GB),所以我仔细看了看mysql-data中包含的文件

我看到以下文件

12K #sql-5254_eaa3.frm 8.9G #sql-5254_eaa3.ibd 12K #sql-537f_8d5b.frm 11G #sql-537f_8d5b.ibd 

即使在mysql重新启动,服务器重新启动等之后,以上依然存在

任何想法,如果这些临时表,幸存下来,如崩溃? 在生产系统上安全地移除它们还是需要以不同的方式处理它们?

顺便说一句,我们有file_per_table设置为true。

提前感谢任何提示!

您看到的表文件很可能是由ALTER TABLE操作导致的,无法完成。 MySQL文档的相关部分说:

如果MySQL在ALTER TABLE操作中间崩溃,那么最终可能会在InnoDB表空间中生成一个孤立的临时表。 使用Table Monitor,你可以看到一个名字以#sql-开头的表格。 如果在反引号内包含名称,则可以在名称中包含字符“#”的表上执行SQL语句。 因此,您可以使用前面介绍的方法像其他孤儿表一样丢弃这样的孤儿表。 要在Unix shell中复制或重命名文件,如果文件名包含“#”,则需要将文件名放在双引号内。

所以我只是简单地发一个DROP TABLE 。 注意: 不要简单地删除这些文件 ,否则你会得到所谓的孤立表,产生如下的数据库引擎警告:

 InnoDB: in InnoDB data dictionary has tablespace id N, InnoDB: but tablespace with that id or name does not exist. Have InnoDB: you deleted or moved .ibd files? InnoDB: This may also be a table created with CREATE TEMPORARY TABLE InnoDB: whose .ibd and .frm files MySQL automatically removed, but the InnoDB: table still exists in the InnoDB internal data dictionary. 

我意识到这可能是临时文件..最好是如果你可以:

  • 转储您的整个数据库

mysqldump -uuser -ppass数据库>文件

  • 放下你的数据库,并从转储重新创build它

cat文件| mysql -uuser -ppass数据库

来自底部的警告仍然适用。

我最初的回答:

这些名字是否与你的表名相对应? 很可能是的,如果是的话 – 那只是数据文件。 innodb存储引擎[ibd扩展build议你使用它]不缩小数据文件。 让他们变小的唯一方法是:

  • 转储每个表并重新创build它:

mysqldump -uuser -ppass数据库表名>文件; cat文件| mysql -uuser -ppass数据库

  • 运行“优化表tableName” 在MySQL的每个“大”表

警告 – 这两个操作将花费大量的时间[非常取决于表中的索引数量,您的io子系统; 如果不是更多的话,我们最可能谈论几个小时]; 将阻止读取。 不要在生产时间运行这个。