象:在重建索引后,发现Mysqlserver的磁盘空间快满了
在用例如以下指令重建索引
mysql> alter table skatetab add unique index(id, uid), drop primary key, add primary key(uid, id);
在重建索引的过程中,因为空间缺乏,致使Mysql server reboot,重新启动以后发现空间少了100G。所以查看是哪个文件夹占用了这100G,最终发现在数据文件夹里发现
十分多相似#sql-*.ibd暂时文件和同文件名称的#sql-*.frm。已然知道是暂时表了,那就删去吧,必定不能直接经过rm删去了,因为在ibdata里保留字典信息和Undo信
息,数据库重新启动后会报错的。
删去的办法:
在alter table的过程中,假定Mysql俄然crash了。就会在数据文件夹里存在一些中心表,这些中心表是以“#sql-”开头的暂时表,在你的数据文件夹里会看到
#sql-*.ibd和对应的 #sql-*.frm ,假定 #sql-*.ibd 和 #sql-*.frm两个文件都存在数据文件夹里的话,可以直接drop table。相似:
mysql> drop table `#mysql50##sql-928_76f7`;
前缀”#mysql50#“是让Mysql疏忽文件名称的安全编码,这个前缀是在Mysql5.1引进的
因为我的数据文件夹里#sql-*.ibd 和 #sql-*.frm两个文件都存,所以直接drop就可以了。磁盘空间100多G也回收了,例如以下所看到的
mysql> drop table `#mysql50##sql-928_76f7`;
Query OK, 0 rows affected (16.28 sec)
阐明:假定在数据文件夹里只是有#sql-*.ibd。而没有#sql-*.frm的话,就需要特殊处理
1.在还有一数据schema里创立一个和欲删去表相同的表结构(包括同样的列和索引)
mysql> create database test
mysql> create table test.tmp like skatetab; //只是复制表的结构和索引。不复制数据
2.把新创立的暂时表的.frm文件拷贝到欲删去的数据文件夹里。并改动和 ”#sql-*.ibd“相同的文件名称
shell> cp test/tmp.frm #sql-928_76f7.frm
3.承认#sql-*.ibd 和 #sql-*.frm两个文件都存,然后直接drop,例如以下:
mysql> drop table `#mysql50##sql-928_76f7`;
(责任编辑:最模板)