在我们的一个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数据库>文件
cat文件| mysql -uuser -ppass数据库
来自底部的警告仍然适用。
我最初的回答:
这些名字是否与你的表名相对应? 很可能是的,如果是的话 – 那只是数据文件。 innodb存储引擎[ibd扩展build议你使用它]不缩小数据文件。 让他们变小的唯一方法是:
mysqldump -uuser -ppass数据库表名>文件; cat文件| mysql -uuser -ppass数据库
警告 – 这两个操作将花费大量的时间[非常取决于表中的索引数量,您的io子系统; 如果不是更多的话,我们最可能谈论几个小时]; 将阻止读取。 不要在生产时间运行这个。