视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Mysql如何删除以“#sql-”开头的临时表_MySQL
2020-11-09 19:42:48 责编:小采
文档


author:skate
time:2014/09/28

Mysql如何删除以“#sql-”开头的临时表

现象:在重建索引后,发现Mysql服务器的磁盘空间快满了

在用如下命令重建索引

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`;

参考:http://dev.mysql.com/doc/refman/5.5/en/innodb-troubleshooting-datadict.html

------end------

下载本文
显示全文
专题